offsetof函数原型如上
第一个参数为类型;
第二个参数为成员名;
运行效果如下:
#include<stdio.h>
#include<stddef.h>
struct S
{
char a;
int b;
char c;
};
int main()
{
printf("%d\n", offsetof(struct S, a));//0
printf("%d\n", offsetof(struct S, b));//4
printf("%d\n", offsetof(struct S, c));//8
return 0;
}
下面我们来模拟实现offsetof宏:
#define MY_OFFSETOF(type,h) ((size_t)&((type*)0)->h)
#include<stdio.h>
#include<stddef.h>
struct S
{
char a;
int b;
char c;
};
int main()
{
struct S s = { 0 };
printf("%d ", MY_OFFSETOF(struct S,a));
return 0;
}
(size_t)为强制类型转换,转换为无符号数
&((type*)0)->h是通过结构体地址找到结构体的成员。