C++同声明语句内初始化指针指向同语句数组是否合法?
结论
- 你给出的单行声明写法完全符合C++标准,
ptr一定会被初始化为和buf相等的地址,不存在编译器重排初始化顺序的可能,不属于未定义行为。 - 仅你示例中后续直接读取
*ptr的操作,如果buf是未初始化的自动存储期局部数组,会因为读取未初始化值触发未定义行为,该问题和指针初始化逻辑无关。
标准依据
C++标准明确规定:同一简单声明语句中的多个初始化声明符(init-declarator)按从左到右的顺序逐个处理,前一个声明符定义的实体,会完全进入作用域且分配好存储空间后,才会处理右侧后续的声明符。
对于你写的代码:
char buf[7], *ptr = buf;
编译器的处理顺序是固定的:
- 完成
buf数组的定义,分配对应存储空间,buf作为数组名可正常使用 - 再处理
ptr的声明和初始化,此时buf已经是合法可用的左值,用其初始化ptr完全合法,最终ptr必然指向buf数组的首地址。
补充说明
你本地测试结果完全符合标准要求,即使开启最高优化等级,合规的编译器也不会调整上述处理顺序,无需将声明拆分为两行也能保证逻辑正确。
唯一需要注意的是:如果你的buf是定义在函数内部的局部数组,且没有做显式初始化,数组内的元素值是不确定的,此时直接读取*ptr会触发未定义行为,和指针本身的初始化是否正确无关。
内容的提问来源于stack exchange,提问作者Isarcus
相关产品推荐
相关产品推荐

