版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengfeng0328/article/details/86775905
计算结构体中某个元素相对结构体首字节地址的偏移量,参考代码如下:
#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)
代码解析:
(TYPE *)0 是一个强制类型转换,把 0 地址强制类型转换成一个指针,这个指针指向一个 TYPE 类型的结构体变量,实际上这个结构体变量可能不存在内存空间中,但是只要不去解引用这个指针就不会出错。
对于 (((TYPE *)0)->MEMBER) 来说,(TYPE *)0 表示一个 TYPE 类型的结构体指针。通过指针来访问这个结构体变量的 MEMBER 元素,&((TYPE *)0)->MEMBER 等效于 &(((TYPE *)0)->MEMBER) - &(((TYPE *)0))