结构偏移宏

时间:2012-12-12 12:04:12

标签: c pointers struct offset

  

可能重复:
  Why does this C code work?

我确实看到定义了一个宏来计算结构偏移,如下所示

#define offsetof(st, m) ((size_t)(&((st *)0)->m))

但我不知道这个定义是如何运作的。看起来像是通过NULL指针访问结构的成员。任何人都可以详细说明这个表达式的工作原理吗?

2 个答案:

答案 0 :(得分:1)

此表达式在编译时进行了优化,从而导致程序中的编译时偏移值。

编译器看到一个常量指针(0),看到它的常量偏移量,只是应用constant folding,产生地址0 + offset(== offset),这就是我们需要的。

有趣的是,它是否在没有任何优化的情况下工作,或者总是进行一些基本的常量折叠。

P.S。更准确地说,这种优化被称为Scalar Replacement of Aggregates,正如下面的雷某所指出的那样。

答案 1 :(得分:1)

1)首先是指向类型' st'的结构的空指针。创建:(st *)0

2)接下来采用这种结构的成员: - > m

3)接下来会员的地址为:&(...)

4)最后,成员的地址被强制转换为size-t类型:(size_t)(...)

工作发生在第3步,因为指针为空(即地址== 0),然后成员的地址只包含结构中的成员位置。

相关问题