C语言动态数组惯用初始化是否触发未定义行为?标准规则合规性疑问
结论
你的解读不正确,这段代码是完全合法的C代码,不存在未定义行为。
核心误区说明
你对C标准相关条款的适用范围存在教条化的误读:
- 对effective type规则的理解偏差:首次通过
a[0] = 0访问首地址存储时,只会将首地址对应的sizeof(int)字节的有效类型设置为int,不会限制同一块动态分配的连续存储的其他区域的使用。后续用a[1]、a[2]访问偏移后的存储位置时,本身就是用int类型左值访问未设置类型的存储,会自动将对应位置的有效类型设置为int,完全符合6.5p6的规则要求。 - 误用了单对象指针的数组等价规则:6.5.6p7的适用前提是指针指向的是独立的、不属于更大数组的单个对象。而
malloc返回的连续存储区域的设计初衷,就是允许使用者将其划分为任意多个连续的同类型对象作为数组使用,这是malloc函数存在的基础意义。标准文本虽然没有直白写明“连续同类型对象可视为数组”的表述,但这是C语言的基础设计共识,所有主流编译器和标准实现都认可该用法。
如果你的解读成立,所有动态分配数组的C代码都会变成未定义行为,这显然违背C标准的制定意图。目前该问题的争议本质是C标准文本的表述疏漏,实际工程和标准解释层面都早已统一认定这种用法完全合法。
内容的提问来源于stack exchange,提问作者tstanisl
相关产品推荐
相关产品推荐

