C ++自引用数组?

时间:2016-10-19 17:50:20

标签: c++

我在一个数组中通过自引用意外地在程序中创建了一个错误。这是一个非常简化的演示程序,类似于概念:

#include <iostream>
using namespace std;

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

int main() {
    cout << kTest[0] << endl;
}

我很惊讶我既没有收到编译错误,也没有收到关于此代码的警告!在我的情况下,它最终产生不可预测的输出。它是否访问垃圾内存?

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

修改:如果kTeststatic,会有所不同吗?那么const呢?既?

2 个答案:

答案 0 :(得分:15)

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

类似,如果不完全相同
int x = x;

如果在函数中本地声明,它将是未定义的行为。

kTest是全局变量时似乎已经很好地定义了。有关其他详细信息,请参阅the other answer

答案 1 :(得分:8)

我不确定这是不确定的。引用当前的draft

  

[basic.start.static] / 3

     

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

对我来说,当动态初始化开始时,kTest似乎已经零初始化,因此可以将其定义为初始化为0