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

在C语言中,读取超出对象范围的操作是否属于未定义行为?

确认:该操作确实属于未定义行为

你说得完全没错,这段代码里的解引用操作*p确实是C标准定义的未定义行为,咱们从几个核心规则来拆解为什么:

1. 违反严格别名规则(Strict Aliasing Rule)

C标准的6.5p7条款明确规定了允许通过指针访问对象的类型范围:只有当指针的类型和对象的有效类型兼容,或者是对象类型的有符号/无符号版本,或者是字符类型时,才是合法的访问。

在你的代码里,对象a的有效类型是int32_t,而你用double*类型的指针去访问它——double和int32_t既不兼容,也不属于上述允许的例外情况,直接违反了严格别名规则,这本身就构成未定义行为。

2. 内存访问超出对象的生命周期范围

int32_t类型的对象通常占用4字节内存,而double类型在绝大多数平台上是8字节。当你解引用double*指针时,会尝试从&a的地址开始读取8字节的数据,但原对象a只占用了前4字节,剩下的4字节属于栈上的未知内存(可能是其他变量的空间,或者栈帧的冗余数据)。

根据C标准6.2.4p2条款,对象的生命周期只覆盖它所占用的内存区域,访问超出这个范围的内存属于未定义行为;同时6.5p10条款也指出,指针只有指向有效对象的内存区域时,解引用操作才是合法的。

补充:转换指针本身是允许的,但解引用不行

需要注意的是,(double*)(&a)这个指针转换操作本身是符合标准的(C标准允许任何对象指针转换为其他对象指针类型,只是转换后的指针只有在满足特定条件时才能安全解引用),但后续的*p读取操作才是触发未定义行为的关键。

哪怕在某个特殊平台上int32_t和double的大小完全相同,严格别名规则依然会导致这个操作是未定义行为——类型不兼容的访问本身就是被标准禁止的。

内容的提问来源于stack exchange,提问作者wt.cc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:58:38