为什么此代码在使用可变数组大小时不会生成错误?

Why doesn't this code generate an error on using a variable array size?

本文关键字:小时 错误 数组 代码 为什么      更新时间:2023-10-16

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

int f;
std::cin >> f;
int c[f];
c[100] = 5;

我使用gcc(Ubuntu 4.8.2-19ubuntu1)4.8.2进行编译,它不仅可以编译,而且可以以某种方式运行。

这是怎么发生的?

C99接受可变长度数组,gcc接受它们作为C90和C++中的扩展。

使用-pedantic-Wvla会将其转化为C++代码中的警告,而-Werror=vla会将其转变为错误。

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