Inv*_*tus 5 c pointers structure offset
#define offsetof(type, member) ((size_t)(&((type *)0)->member))
Run Code Online (Sandbox Code Playgroud)
我不明白(&((type *)0)->member)这究竟是什么告诉我的.....
这里的类型可能是一个结构或其他东西?? ...
更具体地说,这是什么告诉我?
这是为了确定struct字段的偏移量.它的工作原理是使用0作为结构的地址,然后询问字段的地址:
(type *)0
Run Code Online (Sandbox Code Playgroud)
是0作为指针 type
&((type *)0)->member
Run Code Online (Sandbox Code Playgroud)
是该假设结构member成员的地址.如果结构的地址为0,则成员的地址与结构开头的偏移量相同.
((size_t)(&((type *)0)->member))
Run Code Online (Sandbox Code Playgroud)
是转换为a的地址size_t是偏移的正确类型.
我把它分解如下:
(type *)0- 转换0为指向类型“”的指针type。即想象一下,type内存地址 0 处有一个类型为“”的对象。
->member- 查看对象中名为 的字段member。
&- 获取该地址。
你也可以这样写:
((size_t)((&((type *)x)->member) - x))
Run Code Online (Sandbox Code Playgroud)
但我们在作弊和利用0,这样最终就没有偏移可以起飞。