这个宏到底在做什么?

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)这究竟是什么告诉我的.....

这里的类型可能是一个结构或其他东西?? ...

更具体地说,这是什么告诉我?

Ned*_*der 6

这是为了确定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是偏移的正确类型.


mat*_*way 2

我把它分解如下:

  1. (type *)0- 转换0为指向类型“”的指针type。即想象一下,type内存地址 0 处有一个类型为“”的对象。

  2. ->member- 查看对象中名为 的字段member

  3. &- 获取该地址。

你也可以这样写:

((size_t)((&((type *)x)->member) - x))
Run Code Online (Sandbox Code Playgroud)

但我们在作弊和利用0,这样最终就没有偏移可以起飞。