【发布时间】:2019-12-12 00:08:47
【问题描述】:
offsetof 在stddef.h 中是这样定义的:
#define offsetof(type, member) ((size_t)&((type *)0)->member)
由于 NULL 指针的取消引用,这是否会调用未定义的行为?如果不是,为什么?
【问题讨论】:
-
没有空指针的解引用
-
它前面有
&。这很重要。 -
<stddef.h>的内容是 C 实现的一部分,而不是程序的一部分。询问它是否未定义就像询问某些恰好是编译器源代码一部分的汇编语言是否具有 C 标准未定义的行为——当然它具有未定义的行为,因为标准未涵盖它。通常<stddef.h>是与编译器一起设计的。除非您的情况是您尝试使用您无法控制且只能依赖标准指定内容的编译器来实现您自己的<stddef.h>,否则问题就错了。 -
@JL2210
#define offsetof(type, f) ((size_t) \ ((char *)&((type *)0)->f - (char *)(type *)0))版本(带有减法,以免,上帝保佑,空指针常量并非所有位为零)应该是非常可移植的。你需要一个额外的智能编译器来搞砸它。
标签: c undefined-behavior offsetof