我有一行代码声明了char
的静态数组,如下所示:
char buf[7];
我想使用指针遍历这个数组,但是buf
本身显然不能增加或减少。我的问题基本上是,是合法的,还是这个未定义的行为:
// Does this guarantee ptr == buf?
char buf[7], *ptr = buf;
// ... because if not, then this could crash my program!
std::cout << *ptr << '\n';
这个例子和类似的例子在我的计算机(WSL,gcc 9.3.0)上编译和运行都很好,带有所有的优化标志。在我运行的每一次测试中,buf == ptr
。但从技术上讲,C++标准是否允许编译器重新排序这些声明,以便将ptr初始化为一些垃圾值?
显然,我可以将它分成两行,避免任何疑问,但我想知道这个一行声明是否有效。
发布于 2021-09-16 13:04:14
这是合法的
是
是这种未定义的行为
不是
:C++标准是否允许编译器重新排序这些声明,以便将ptr初始化为一些垃圾值?
不,它用ptr
衰变到的char*
初始化buf
。如果允许编译器以另一个顺序初始化它们,则需要失败编译,因为它还没有看到buf
。
与之相比:
好的:
char buf[7];
char *ptr = buf;
错误:
char *ptr = buf;
char buf[7];
https://stackoverflow.com/questions/69214987
复制