You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 09:07:06