下面的代码应该生成错误,因为在编译期间编译器无法知道数组大小。
int f;
std::cin >> f;
int c[f];
c[100] = 5;
我正在使用gcc(Ubuntu 4.8.2-19ubuntu1)4.8.2进行编译,它不仅仅是编译,而是以某种方式运行。
它是如何发生的?
答案 0 :(得分:13)
C99 accepts variable length arrays, and gcc accepts them as an extension in C90 and C++
使用-pedantic
或-Wvla
将此变为C ++代码中的警告,-Werror=vla
将其变为错误。
答案 1 :(得分:1)
C ++不进行数组边界检查。 line c[100] = 5;
相当于*(c + 100) = 5;
。您只是告诉编译器写入距离另一个内存位置的某个偏移量的内存位置。如果在程序中输入少于100的内容,则会覆盖堆栈中的某些数据。根据代码的其余部分,这可能会导致堆栈溢出,随机"崩溃,因为一些重要的数据被覆盖,或者它可以正常工作(然后当一些看似无关的更改改变内存布局时随后开始随机崩溃)。