c++自引用数组

C++ self-referencing array?

本文关键字:数组 自引用 c++      更新时间:2023-10-16

我不小心在程序中通过自引用数组创建了一个错误。下面是一个非常简化的演示程序,在概念上类似:

#include <iostream>
using namespace std;
int kTest[] = {
    kTest[0]
};
int main() {
    cout << kTest[0] << endl;
}

我很惊讶,我既没有收到一个编译器错误,甚至警告这段代码!在我的例子中,它最终产生了不可预测的输出。它正在访问垃圾内存吗?

我很好奇在什么情况下会有定义良好的输出(如果有的话!)

Edit:如果kTeststatic会有区别吗?那么const呢?都有?

int kTest[] = {
    kTest[0]
};

类似于

,如果不是完全相同的话
int x = x;

如果在函数中局部声明,这将是未定义的行为。

kTest是全局变量时,它似乎定义得很好。

我不确定这是未定义的。引用自当前草案:

[basic.start.static]/3

如果没有进行常量初始化,则使用static存储时间([basic.stc.static])或线程存储时间([basic.stc.thread])为零初始化([dcl.init])。在一起,零初始化和常量初始化称为静态初始化;其他所有初始化都是动态初始化。静态初始化应在任何动态初始化发生之前执行

在我看来,当动态初始化开始时,kTest已经是零初始化了,所以它可以被定义为初始化为0