Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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++_Gcc_Variable Length Array - Fatal编程技术网

C++ 为什么';这段代码是否会在使用可变数组大小时生成错误?

C++ 为什么';这段代码是否会在使用可变数组大小时生成错误?,c++,gcc,variable-length-array,C++,Gcc,Variable Length Array,下面的代码应该会生成一个错误,因为编译器在编译期间无法知道数组大小 int f; std::cin >> f; int c[f]; c[100] = 5; 我使用gcc(ubuntu4.8.2-19ubuntu1)4.8.2进行编译,它不只是编译,而是以某种方式运行 它是如何发生的? 使用 -PoANDICT< 或 -Wvla >代码>将其转换成C++代码中的警告,并且 -Wrord= VLa/COD>将其转换为错误。< P> C++不做数组边界检查。行c[100]=5相当于*(c

下面的代码应该会生成一个错误,因为编译器在编译期间无法知道数组大小

int f;
std::cin >> f;
int c[f];
c[100] = 5;
我使用gcc(ubuntu4.8.2-19ubuntu1)4.8.2进行编译,它不只是编译,而是以某种方式运行

它是如何发生的?


使用<代码> -PoANDICT< <代码>或<代码> -Wvla >代码>将其转换成C++代码中的警告,并且<代码> -Wrord= VLa/COD>将其转换为错误。

< P> C++不做数组边界检查。
行c[100]=5相当于
*(c+100)=5。您只是告诉编译器以与另一个内存位置的某个偏移量写入内存位置。如果在程序中输入小于100的数据,则会覆盖堆栈上的某些数据。根据代码的其他部分所做的工作,这可能会导致堆栈溢出、由于某些重要数据被覆盖而导致“随机”崩溃,或者它可以正常工作(然后在某些看似无关的更改更改内存布局时开始随机崩溃)。

谢谢。我没有考虑过看C标准。你的描述是正确的,但与问题并不相关,问题是为什么这行
intC[f]f
不是编译时常量时,code>会编译。我确实认识到了这一部分。我只是添加了它,以确保我实际上是在创建一个数组。但我认为这对其他遇到这个问题的人来说是有用的。有关这个话题的更多细节,请参阅。