2015-06-15 44 views
1

我讀到雖然動態內存在運行時在堆上分配,但靜態內存在編譯期間在堆棧上分配,因爲編譯器知道在編譯時需要分配多少內存。在編譯時分配的C++內存

考慮下面的代碼:

int n; 
cin>>n; 
int a[n]; 

編譯器如何可能知道多少內存如果只有在運行過程中讀取它的實際大小在編譯時爲[]分配?

+5

最有可能的一個擴展變長數組是C99特性,但在C++中是不允許的,參見[上一個問題](http://stackoverflow.com/q/19775954/1708801),它解釋了'gcc'和'clang '允許這個,但會用'pedantic'標誌警告。 –

+3

堆棧和堆決不分別綁定到靜態和動態分配。在堆棧上動態分配內存是完全可能的。請參閱'alloca'功能。 –

+0

這是一個很好的觀點,每次討論動態和靜態分配時都應該提到它。是否有可能在堆上靜態分配? – Botond

回答

4

由於您指定的確切原因,您將無法編譯該文件。 C++需要有一個固定的編號才能執行編譯。如果你想這樣做,你必須使用動態分配。

+0

我可能會在這裏丟失一些東西......我用g ++ 4.8.2編譯它,它工作... – Botond

+4

GCC有一個可變長度數組擴展。嘗試用'-pedantic'編譯。 – TartanLlama

+0

沒錯,那給出了錯誤。謝謝! – Botond