下面的代码应该会产生错误,因为编译器在编译期间无法知道数组大小。
int f;
std::cin >> f;
int c[f];
c[100] = 5;
我正在使用 gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 进行编译,它不仅可以编译,而且可以以某种方式运行。
它是如何发生的?
下面的代码应该会产生错误,因为编译器在编译期间无法知道数组大小。
int f;
std::cin >> f;
int c[f];
c[100] = 5;
我正在使用 gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 进行编译,它不仅可以编译,而且可以以某种方式运行。
它是如何发生的?
C99 接受可变长度数组,gcc 接受它们作为 C90 和 C++ 中的扩展。
在 C++ 代码中使用-pedantic
或将其转换为警告,并将其转换为错误。-Wvla
-Werror=vla
C++ 不进行数组边界检查。line c[100] = 5;
相当于*(c + 100) = 5;
。_ 您只是在告诉编译器写入与另一个内存位置有一定偏移的内存位置。如果您在程序中输入小于 100 的任何内容,您将覆盖堆栈上的一些数据。根据您的其余代码所做的事情,这可能会导致堆栈溢出、由于某些重要数据被覆盖而导致“随机”崩溃,或者它可以正常工作(然后当一些看似无关的更改更改时开始随机崩溃)内存布局)。