2014-03-04 106 views
-1

我試圖使動態數組以這種形式:錯誤創建動態C++陣列

int x; 
cin>>x; 
int ar[x]; 

我克++(GCC)上++編譯拒絕無固定尺寸來創建陣列。然而,在dev-cpp的windows上使用相同的代碼,它被編譯和執行,它也允許我創建和使用動態數組,我認爲這是一個編譯器錯誤,但是當我重新啓動並返回到g ++時,它編譯並執行代碼儘管它在我嘗試Windows上的代碼之前拒絕這樣做,那怎麼會是危險的呢?

+1

你沒有做你說的你沒有。像你一樣,G ++對動態大小的數組非常滿意。發佈出錯信息的確切代碼以及錯誤信息 – pm100

回答

1

C++要求在編譯時知道自動存儲陣列的大小,否則該陣列必須動態分配(除非使用compiler extension)。

您應該使用

int *ar = new int[x]; 
... 
delete []ar; // free the memory after use 

vector<int> ar; 
+1

對於'new'方法 - 不要忘記在最後刪除你的記憶:)。 – kolenda

+0

@kolenda已被添加到答案。謝謝。 – herohuyongtao

0

至於其他應答者指出,如果你不知道在編譯時數組的大小,那麼你應該動態地分配使用新。但(somehwat可恥)他們不告訴你,你將負責與刪除重新分配這個內存:details here

這種責任(確保你總是釋放已分配的內存)中的問題,用C的最大來源++。像RAII這樣的技術可以簡化這個過程(簡單地說就是:將內存包裝在一個對象中,在構造函數中新建並在析構函數中刪除,然後語言確保始終調用析構函數)

+0

我需要說清楚一點,我其實知道的方式: int x; cin >> x; int ar [x]; 實際上是一個錯誤的方式來做到這一點,這裏的問題是發生了一些奇蹟,我的GCC拒絕編譯這個代碼,由於數組的大小不固定,後來我重新啓動我的機器後GCC現在編譯這個非常相同的代碼沒有錯誤,多數民衆贊成我想知道,它如何編譯相同的代碼,它拒絕編譯前重新啓動??? !!!!!! – user3043400

+0

它是defintely前後相同版本的GCC?使用相同的命令行? –

+0

是的,它是相同的GCC版本,相同的機器和相同的Linux發行版,我只是重新啓動沒有更多,這就是爲什麼我說「魔術」! – user3043400