奇怪的C ++数组初始化行为

时间:2015-10-01 17:13:53

标签: c++ arrays codeblocks

以下代码

int x;
cin >> x;
int b[x];
b[5] = 8;
cout << sizeof(b)/sizeof(b[0]) << endl << b[5];
输入为10的输出为

的输出:

10
8

这对我来说非常奇怪,因为:

根据http://www.cplusplus.com/doc/tutorial/arrays/,我们甚至不能使用从cin流获得的值来初始化数组。

  

注意:方括号[]中的元素字段(表示数组中元素的数量)必须是常量表达式,因为数组是静态内存块,其大小必须在程序运行之前的编译时确定。

但那不是全部故事!输入为4的x的相同代码有时会给出输出

  

分段错误。核心倾销。

有时提供输出:

4
8

到底发生了什么事?为什么编译器不以单一方式运行?为什么我可以为大于数组的数组索引赋值?为什么我们甚至可以首先使用变量初始化数组?

1 个答案:

答案 0 :(得分:1)

我最初提到这是一个评论,但看到没有人回答,我会在这里添加。

您在上面演示的内容是未定义的行为。这意味着你不能告诉结果会是什么。正如Brian在评论中添加的那样,它将产生一条诊断消息(可能是一个警告)。由于编译器无论如何都会继续,因此它可以被称为UB,因为它没有在标准中定义。