offsetof是标准头文件<stddef.h>的一个宏,作用是找出一个结构体中某个成员变量的偏移量,type是结构体类型,member是该结构体中的一个成员变量。
struct Person
{
char a;
char b;
int c;
};
offsetof(Person,a);//0
offsetof(Person,b);//1
offsetof(Person,c);//4
如图我们可以用offsetof依次得到Person类型中每个成员变量对于起始地址的偏移量。
宏虽然一般全为大写,但offsetof是个例外,虽全是小写但的确是个宏。宏的作用方式是将里面的值进行代替,比函数效率更高。下面我们自己实现一下offsetof宏的功能。
#define offsetof(type,member) ((size_t)&(((type*)0)->member))
首先写出宏的参数列表,因为最后得到的偏移量应该是个正数,故应强制类型转换为size_t类型,其次我们定义一个匿名的该结构体指针并调成0位置,最后得到该结构体成员的地址就是相对于起始地址的偏移量了。
如果对你有帮助,留个赞再走。