当我试图向某人解释为什么C++静态数组不能动态调整大小时,我发现gcc并不同意我的说法。考虑到array的维度argc在编译时并不知道,下面的代码是如何编译的呢?
#include <iostream>
int main(int argc, char* argv[]) {
int array[argc];
for(int i = 0; i < argc; i++) array[i] = argv[i][0];
for(int i = 0; i < argc; i++) std::cout << i << ": " << char(array[i]) << std::endl;
//for(int i = 0; i < 100; i++) { std::cout << i << " "; std::cout.flush(); array[i] = 0; }
return 0;
}
我使用gcc 4.2.1进行了测试,并指定了-Wall,编译器没有任何反应。如果取消最后一个循环的注释,在将值赋给array[53]时会导致段错误。
我之前在array声明之前和之后放置了保护数组,并用零填充它们,确信程序一定会破坏其堆栈的某些部分,但是gcc重新排列了堆栈上的变量,使我无法观察到任何数据损坏。
显然,我并不试图让这段代码“工作”。我只是想知道为什么gcc认为它可以编译该代码。任何提示或解释都将不胜感激。
更新:感谢所有人的帮助和极快的回复!
-pedantic
?),但你没有这样做,因此允许了编译器扩展。 - David Thornley