1

我有一行代码声明了一个静态数组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 初始化为一些垃圾值?

我显然可以将它分成两行并避免任何疑问,但我想知道这个单行声明是否有效。

4

1 回答 1

3

这合法吗

是的

这是未定义的行为吗

C++ 标准是否允许编译器重新排序这些声明,以便将 ptr 初始化为一些垃圾值?

不,它ptr用衰减到的初始化。如果允许编译器以其他顺序初始化它们,则它需要编译失败,因为它还没有看到。char*bufbuf

与这些比较:

好的:

char buf[7];
char *ptr = buf;

错误:

char *ptr = buf;
char buf[7];
于 2021-09-16T21:04:14.140 回答