【发布时间】:2010-10-17 08:53:39
【问题描述】:
在 ANSI C 中,offsetof 定义如下。
#define offsetof(st, m) \
((size_t) ( (char *)&((st *)(0))->m - (char *)0 ))
既然我们取消引用 NULL 指针,为什么这不会引发分段错误?或者这是某种编译器破解,它看到只有偏移量的地址被取出,所以它静态计算地址而不实际取消引用它?这段代码也可以移植吗?
【问题讨论】:
-
这是我在 SO 上看到的第一个抱怨代码有效的问题吗? :-)
-
有一个 if(0){asm(nop)} 的人把它放在外面会导致失败......
-
ANSI C(实际上是 ISO C)没有为
offsetof指定这个定义。它只是指定它必须如何表现。实际定义取决于每个实现,并且可以将一个实现更改为另一个。 -
需要注意的是,符合 MISRA-C:2004 的代码要求不使用
offsetof,因为它很容易导致未定义的行为。