offsetof宏的原理以及作用

来源:互联网 发布:淘宝网看手机 编辑:程序博客网 时间:2024/06/08 13:49

原理:

虚拟一个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);  //0printf("offset:%d\n",offset);int offset1 = offsetof(struct ptr,b); //2printf("offset1:%d\n",offset1);int offset2 = offsetof(struct ptr,c); //4printf("offset2:%d\n",offset2);int offset3 = offsetof(struct ptr,d); //8printf("offset3:%d\n",offset3);return 0 ;}





0 0
原创粉丝点击