我在一个数组中通过自引用意外地在程序中创建了一个错误。这是一个非常简化的演示程序,类似于概念:
#include <iostream>
using namespace std;
int kTest[] = {
kTest[0]
};
int main() {
cout << kTest[0] << endl;
}
我很惊讶我既没有收到编译错误,也没有收到关于此代码的警告!在我的情况下,它最终产生不可预测的输出。它是否访问垃圾内存?
我很好奇在什么情况下这会有明确定义的输出(如果有的话!)。
修改:如果kTest
为static
,会有所不同吗?那么const
呢?既?
答案 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
。