这个宏到底在做什么?

时间:2012-02-16 00:15:31

标签: c pointers structure offset

#define offsetof(type, member)  ((size_t)(&((type *)0)->member))

我不理解(&((type *)0)->member)这究竟告诉我什么.....

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

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

3 个答案:

答案 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)

我把它分解成这样:

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

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

  3. & - 获取该地址。

  4. 您也可以这样写:

    ((size_t)((&((type *)x)->member) - x))
    

    但是我们在欺骗并使用0,以便最后没有偏移量。