2013-10-20 148 views
4
void method(string a) { 
    int n = a.size(); 
    int array[n]; 
} 

上述代碼可以使用gcc正確編譯。數組的大小如何來自非常量變量?編譯器是否自動將int array[n]轉換爲int* array = new int[n]C++聲明一個基於非常量變量的數組?

+5

這是一個編譯器擴展。 – chris

+3

使用'const'。使用參考。使用矢量 –

+0

使用GCC,用'-pedantic-errors'編譯你的代碼,然後看看它說了什麼! – Nawaz

回答

6

數組的大小如何來自非常量變量?

目前,因爲該編譯器有一個非標準的擴展,它允許您在C++程序中使用C的可變長度數組。

編譯器是否自動將int array[n]轉換爲int* array = new int[n]

這是一個實現細節。我相信GCC會將它放在堆棧上,就像正常的自動變量一樣。如果堆棧的大小太大,它可能會或可能不會使用動態分配;我不認識我自己。

0

動態分配。關鍵字new將使用指針和一些分配來完成此操作。

int * ptr; 
int n = a.size(); 
ptr = new int[n]; 
+0

這樣做的另一個好處是指針地址可以從函數返回,其中靜態創建的數組從函數返回時從堆棧上擦除 –

+0

變量ptr可以像使用數組,例如你可以使用像[ptr [a-1]]這樣的[]下標來訪問數組的最後一個元素 –

+2

我認爲這個缺點是你需要自己明確地管理內存並記得調用'稍後刪除[]'。真的,只需使用'std :: vector'。 – jamesdlin

0

根據this編譯器允許用C這個表達式++儘可能C90/99。