在試圖向某人解釋爲什麼C++靜態數組無法通過動態調整大小時,我發現gcc與我不同意。考慮到argc的數組在編譯時不知道,下面的代碼是如何編譯的?C++動態大小的靜態數組益智遊戲
#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,沒有從編譯器中弄髒髒的樣子。如果我取消註釋最後一個循環,則當我將其分配給數組[53]時,會發生段錯誤。
我以前放置防護件陣列之前和陣列的聲明之後,並已以零填充它們,可以肯定,該程序必須被搗毀其堆棧的一部分,但GCC重新排序堆棧上的變量,使得我無法觀察到任何數據損壞。
很顯然,我並不想讓這段代碼「工作」。我只是想了解爲什麼gcc甚至認爲它可以編譯代碼。任何提示或解釋將不勝感激。
更新:感謝所有您的幫助和可笑的快速響應!
由C99讓我覺得:http://bytes.com/topic/c/answers/770297-c99-dynamic-array – Kevin 2011-06-08 19:59:56
另一個基本問題是你正在使用一個編譯器來測試語言中是否有可能。你可以在gcc中指定一個標準,並且你可以要求嚴格遵守標準('-pedantic'?),但你沒有,因此你允許編譯器擴展。 – 2011-06-08 20:01:25