以下代码
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
到底发生了什么事?为什么编译器不以单一方式运行?为什么我可以为大于数组的数组索引赋值?为什么我们甚至可以首先使用变量初始化数组?
答案 0 :(得分:1)
我最初提到这是一个评论,但看到没有人回答,我会在这里添加。
您在上面演示的内容是未定义的行为。这意味着你不能告诉结果会是什么。正如Brian在评论中添加的那样,它将产生一条诊断消息(可能是一个警告)。由于编译器无论如何都会继续,因此它可以被称为UB,因为它没有在标准中定义。