ISO C 1999中使用sizeof ((struct T *)0)->field是否严格合规?
ISO C99中
sizeof ((struct T *)0)->field的严格合规性分析 问题背景
聚焦ISO C 1999标准(排除C++及所有C语言后续版本),探讨sizeof ((struct T *)0)->field这种获取结构体成员大小的写法是否属于严格合规用法,示例代码如下:
#include <stddef.h> struct thing { int a; short b[3]; }; const size_t size_of_thing_b = sizeof ((struct thing *)0)->b; /* 待分析代码行 */
核心分析
- 初始误解:曾认为该写法存在未定义行为,理由是类似表达式
&((struct thing *)0)->b明确属于未定义行为——抽象机会对空指针执行解引用操作。 - 关键标准依据:将
&替换为sizeof后,根据C99标准6.5.3.4第2款规定,sizeof的操作数不会被求值(除非涉及变长数组,本例不涉及)。这意味着抽象机不会执行任何实际的指针解引用动作,仅需推导表达式的类型即可确定sizeof的结果,不存在触发未定义行为的前提。 - 合规性结论:在C99标准下,该写法不存在未定义行为,属于严格合规的用法。此前相关问题的回答默认该写法结果明确,这一结论完全符合标准要求。
次要关注:1999年后标准的变化
C11及后续C语言标准并未修改sizeof操作数不求值的核心规则,也未发布针对该写法的矛盾缺陷报告(DR)。实际上,后续标准进一步明确了这类基于空指针常量的结构体成员访问在sizeof中的合法性,该写法的合规性在后续C版本中得到了延续。
内容的提问来源于stack exchange,提问作者zwol
相关产品推荐
相关产品推荐

