宏offsetof的使用及其模拟实现

使用宏offsetof的时候需要包含这个头文件。

宏offsetof有两个参数,第一个参数是结构体类型,第二个参数是结构体成员,计算的是结构体成员相较于结构体起始位置的偏移量,我们来看一个例子:

宏offsetof的使用及其模拟实现_第1张图片

 在这个例子中,结构体成员c1相较于结构体起始位置偏移量是0,结构体成员a相较于结构体起始位置偏移量是4,结构体成员c2相较于结构体起始位置偏移量是8,。

那么如何自己模拟实现offsetof这个宏呢?

假设我把创建的结构体放到0地址处,那么结构体成员的地址就是结构体成员相较于结构体起始位置偏移量,那么可以这样实现:

#define OFFSETOF(type, mem) (size_t)&(((type*)0)->mem)

将0地址看作结构体的起始地址,将0地址强制转换成结构体指针类型,取出结构体成员的地址,将其转换成无符号整形size_t类型。

宏offsetof的使用及其模拟实现_第2张图片

你可能感兴趣的:(C语言小知识,c语言)