我試圖使動態數組以這種形式:錯誤創建動態C++陣列
int x;
cin>>x;
int ar[x];
我克++(GCC)上++編譯拒絕無固定尺寸來創建陣列。然而,在dev-cpp的windows上使用相同的代碼,它被編譯和執行,它也允許我創建和使用動態數組,我認爲這是一個編譯器錯誤,但是當我重新啓動並返回到g ++時,它編譯並執行代碼儘管它在我嘗試Windows上的代碼之前拒絕這樣做,那怎麼會是危險的呢?
我試圖使動態數組以這種形式:錯誤創建動態C++陣列
int x;
cin>>x;
int ar[x];
我克++(GCC)上++編譯拒絕無固定尺寸來創建陣列。然而,在dev-cpp的windows上使用相同的代碼,它被編譯和執行,它也允許我創建和使用動態數組,我認爲這是一個編譯器錯誤,但是當我重新啓動並返回到g ++時,它編譯並執行代碼儘管它在我嘗試Windows上的代碼之前拒絕這樣做,那怎麼會是危險的呢?
C++
要求在編譯時知道自動存儲陣列的大小,否則該陣列必須動態分配(除非使用compiler extension)。
您應該使用
int *ar = new int[x];
...
delete []ar; // free the memory after use
或
vector<int> ar;
對於'new'方法 - 不要忘記在最後刪除你的記憶:)。 – kolenda
@kolenda已被添加到答案。謝謝。 – herohuyongtao
至於其他應答者指出,如果你不知道在編譯時數組的大小,那麼你應該動態地分配使用新。但(somehwat可恥)他們不告訴你,你將負責與刪除重新分配這個內存:details here
這種責任(確保你總是釋放已分配的內存)中的問題,用C的最大來源++。像RAII這樣的技術可以簡化這個過程(簡單地說就是:將內存包裝在一個對象中,在構造函數中新建並在析構函數中刪除,然後語言確保始終調用析構函數)
我需要說清楚一點,我其實知道的方式: int x; cin >> x; int ar [x]; 實際上是一個錯誤的方式來做到這一點,這裏的問題是發生了一些奇蹟,我的GCC拒絕編譯這個代碼,由於數組的大小不固定,後來我重新啓動我的機器後GCC現在編譯這個非常相同的代碼沒有錯誤,多數民衆贊成我想知道,它如何編譯相同的代碼,它拒絕編譯前重新啓動??? !!!!!! – user3043400
它是defintely前後相同版本的GCC?使用相同的命令行? –
是的,它是相同的GCC版本,相同的機器和相同的Linux發行版,我只是重新啓動沒有更多,這就是爲什麼我說「魔術」! – user3043400
你沒有做你說的你沒有。像你一樣,G ++對動態大小的數組非常滿意。發佈出錯信息的確切代碼以及錯誤信息 – pm100