#define offsetof(type, member) ((size_t)(&((type *)0)->member))
我不理解(&((type *)0)->member)
这究竟告诉我什么.....
这里的类型可能是一个结构或其他东西?? ...
更具体地说,0告诉我什么?
答案 0 :(得分:6)
这是为了确定struct字段的偏移量。它的工作原理是使用0作为结构的地址,然后询问字段的地址:
(type *)0
是0作为指向type
&((type *)0)->member
是该假设结构member
成员的地址。如果struct的地址是0,那么该成员的地址与结构开头的偏移量相同。
((size_t)(&((type *)0)->member))
是转换为size_t
的地址是偏移的正确类型。
答案 1 :(得分:3)
宏将地址(0)转换为声明的类型(“type”),然后访问字段(“member”)并获取地址。结果是,从地址0偏移的字段地址给出了字段类型(结构/联合)开头的偏移量。
答案 2 :(得分:2)
我把它分解成这样:
(type *)0
- 将0
投射到指向“type
”的指针。即想象一下,在内存地址0处有一个类型为“type
”的对象。
->member
- 查看名为member
的字段的对象。
&
- 获取该地址。
您也可以这样写:
((size_t)((&((type *)x)->member) - x))
但是我们在欺骗并使用0
,以便最后没有偏移量。