#define offset(struct_name, struct_member) (unsigned int)(&(((struct_name *)0)->struct_member))

指针本身存储的就是一个地址,是个无符号整数,和unsigned int大小相同。指针强制类型转换并不改变该指针存储的值,改变了该指针指向的的数据的数据类型。

int a = 'a';
char *p = (char*)&a;//&a就是一个整数,代表局部变量a的地址,p也等于这个地址值,只是指向的是char类型

所以上面的宏首先将0强制转换为结构体的指针,指向的地址为0。'&(((struct_name *)0)->struct_member)'即为元素的地址,偏移量为元素地址减去结构体首地址(这里为0),最后转换为无符号整型。

posted on 2022-09-13 10:13  saury2022  阅读(201)  评论(0)    收藏  举报