Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 奇怪的C++;数组初始化行为_C++_Arrays_Codeblocks - Fatal编程技术网

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

C++ 奇怪的C++;数组初始化行为,c++,arrays,codeblocks,C++,Arrays,Codeblocks,下面的代码 int x; cin >> x; int b[x]; b[5] = 8; cout << sizeof(b)/sizeof(b[0]) << endl << b[5]; 我觉得这很奇怪,因为: 根据,我们甚至不能使用从cin流获得的值初始化数组 注意:方括号[]内的elements字段表示数组中的元素数,必须是一个常量表达式,因为数组是静态内存块,其大小必须在程序运行之前在编译时确定 但这不是全部!输入x为4的同一代码有时会给出输出

下面的代码

int x;
cin >> x;
int b[x];
b[5] = 8;
cout << sizeof(b)/sizeof(b[0]) << endl << b[5];
我觉得这很奇怪,因为:

根据,我们甚至不能使用从cin流获得的值初始化数组

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

但这不是全部!输入x为4的同一代码有时会给出输出

分段错误。堆芯倾倒

有时会给出输出:

4
8

到底发生了什么事?为什么编译器不以单一的方式工作?为什么我可以给比数组大的数组索引赋值?为什么我们一开始就可以使用变量初始化数组呢?

我最初提到这是一个注释,但鉴于没有人回答,我将在这里添加它


您在上面演示的是未定义的行为。这意味着你不知道结果会是什么。正如Brian在评论中所说,这将导致一条诊断消息(可能是一条警告)。由于编译器将继续运行,因此它可以称为UB,因为标准中没有定义它。

我认为这就是未定义行为的含义。你不知道它会做什么。它是C99的一个特性。访问超出边界的数组是未定义的行为,不要这样做。@Shafik Yaghm谢谢,这条消息帮助我了解了发生了什么on@therainmaker不是UB。需要诊断。@Brian:你说“需要诊断”是什么意思?
4
8