原理:
虚拟一个TYPE类型的结构体变量,通过TYPE.MEMBER的方式来访问MEMBER成员,进而得到MEMBER成员相对于整个结构体首地址的偏移量。
作用:为接下来的container_of宏的讲解出现做铺垫
offsetof宏: #define offsetof(TYPE,MEMBER) ((int) &((TYPE *)0)->MEMBER)
接下来看看例程就明白了,其实这个宏挺简单的,&((TYPE *)0)->MEMBER其实相当于得到了成员的偏移减去0地址偏移,也就是结构体的首地址,进而就得到了该成员相当于整个结构体的偏移量。
#include <stdio.h> #define offsetof(TYPE,MEMBER) ((int) &((TYPE *)0)->MEMBER) #pragma pack(4) struct ptr { char a ; short b ; int c ; double d ; }; #pragma pack() int main(void) { struct ptr Pt ; printf("ptr:%d\n",sizeof(struct ptr));//16 //相对地址偏移量 int offset = offsetof(struct ptr,a); //0 printf("offset:%d\n",offset); int offset1 = offsetof(struct ptr,b); //2 printf("offset1:%d\n",offset1); int offset2 = offsetof(struct ptr,c); //4 printf("offset2:%d\n",offset2); int offset3 = offsetof(struct ptr,d); //8 printf("offset3:%d\n",offset3); return 0 ; }