2013-11-03 42 views

回答

5

如你所提到的,C++數組大小必須是常量表達式。
- 使用VS,您將獲得:error C2057: expected constant expression
- GCC對標準進行了擴展,允許您的代碼進行編譯。

3

對於堆棧分配,數組大小需要在編譯時確定。但是數組的大小是在運行時確定的,所以它必須放在堆上。

使用

int *re = new int[m]; 
cout << m << endl; 
delete[] re; 
+0

是的,但沒有回答這個問題。 OP詢問它爲什麼在GCC中起作用。 –

+0

嗯,是的,但這個問題可能會被問及任何事情。 「爲什麼這種非標準的東西不會崩潰?」 –

1

正如其他人已經提到的,你的代碼是非標準C++,你有一個變長數組

int m; 
    cin>>m; 
    int re[m]; // m is not a compile time constant! 

GCC允許以此爲語言的擴展。如果您啓用-Wvla,您會收到警告。 Afaik,如果你在gcc使用特定的C++標準,例如aus -std=c++11,這段代碼就會被拒絕。

現在你_could做到這一點,而不是(如保羅·德雷珀已經寫)

int *re = new int[m]; // dynamic array allocation 
delete[] re;   // giving the memory back to the operating system 

但是,C++提供了一個易於使用的包裝器這樣的:

std::vector<int> re(m); 

對於大多數事情一樣,向量只是表現就像動態分配的陣列一樣,但是可以防止您意外忘記delete或雙重delete,並使數據更容易傳遞給函數。瞭解更多有關矢量cppreference.com

+0

我已經知道向量和動態分配...我只是想知道爲什麼這個代碼工作.... –

+1

@TamojitChatterjee這很好,但其他人可能不會。有人可能會在未來發現這個問題。如果在至少一個答案中提到了可靠的備選方案,那麼這很好。 – stefan

相關問題