为什么此代码在使用可变数组大小时不会生成错误?
Why doesn't this code generate an error on using a variable array size?
下面的代码应该会产生错误,因为编译器无法在编译期间知道数组大小。
int f;
std::cin >> f;
int c[f];
c[100] = 5;
我正在使用 gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 进行编译,它不仅可以编译,而且可以以某种方式运行。
它是如何发生的?
C99 accepts variable length arrays, and gcc accepts them as an extension in C90 and C++.
使用 -pedantic
或 -Wvla
将其转换为 C++ 代码中的警告,而 -Werror=vla
将其转换为错误。
C++ 不进行数组边界检查。 line c[100] = 5;
等同于 *(c + 100) = 5;
。您只是告诉编译器写入与另一个内存位置有一定偏移量的内存位置。如果您在程序中输入任何小于 100 的值,您将覆盖堆栈中的一些数据。根据其余代码的作用,这可能会导致堆栈溢出,"random" 崩溃,因为一些重要的数据被覆盖,或者它可以正常工作(然后在一些看似无关的更改时开始随机崩溃更改内存布局)。
下面的代码应该会产生错误,因为编译器无法在编译期间知道数组大小。
int f;
std::cin >> f;
int c[f];
c[100] = 5;
我正在使用 gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 进行编译,它不仅可以编译,而且可以以某种方式运行。
它是如何发生的?
C99 accepts variable length arrays, and gcc accepts them as an extension in C90 and C++.
使用 -pedantic
或 -Wvla
将其转换为 C++ 代码中的警告,而 -Werror=vla
将其转换为错误。
C++ 不进行数组边界检查。 line c[100] = 5;
等同于 *(c + 100) = 5;
。您只是告诉编译器写入与另一个内存位置有一定偏移量的内存位置。如果您在程序中输入任何小于 100 的值,您将覆盖堆栈中的一些数据。根据其余代码的作用,这可能会导致堆栈溢出,"random" 崩溃,因为一些重要的数据被覆盖,或者它可以正常工作(然后在一些看似无关的更改时开始随机崩溃更改内存布局)。