2013-03-16 84 views
1

例如,我有動態大小的陣列基於用戶輸入:在哪裏創建動態大小數組? (堆棧或堆)

int n; 
cin >> n; 
int items[n]; 

這是陣列上堆分配?或者是它堆一樣,如果我寫:

int n, *items; 
cin >> n; 
items = new int[n]; 
... 
delete [] items; 

編輯:據我所知,第二個代碼做什麼。我問第一個代碼是否像第二個代碼一樣執行相同的操作,但使用的行數較少。

+0

相關:http://stackoverflow.com/a/1169916/1141471 – sehe 2013-03-16 19:46:08

回答

5

你的第一個例子中沒有使用動態數組在所有 - 它使用一個堆棧分配的變長數組(通常幕後相當於一個alloca調用,除了sizeof運算符),這是C99的一個功能,而不是C++。

你的第二個數組當然是通過new分配在堆上的。

+6

請注意,標準C++不支持變長數組,因此第一個代碼片段在C99(無'iostream's)和C++(無VLA)中都將是語法錯誤。不過,有些編譯器支持C++中的VLA作爲擴展。 – 2013-03-16 19:29:32

+0

@Insilico是正確的,但許多C++編譯器支持C99功能作爲擴展(至少GCC,Clang,也許MSVC)。 – 2013-03-16 19:30:15

+1

@Insilico我會在沒有警告的情況下編譯。用g ++進行測試,沒有任何構建參數。 – kravemir 2013-03-16 19:32:47

1

您使用new分配內存,讓您的數組存儲在堆

+0

我問動態大小的數組背後是什麼,而不是第二個代碼是什麼:) – kravemir 2013-03-16 19:27:30

+2

是的,堆是什麼作爲後盾在這種情況下存儲動態大小的數組。你還想知道什麼? – 2013-03-16 19:28:38

+0

如果您創建一個不帶「新」或動態內存分配函數的數組,並且大小不變,那麼它將存儲在堆棧中。如果你爲你的數組分配一個內存(並且size也可能是一個非const表達式),那麼它就在堆中。 – nabroyan 2013-03-16 19:34:47

-1

您的第一個代碼塊將無法編譯,您無法使用new或malloc/calloc/realloc分配一個動態大小的數組。

爲了做你想做的事情,你需要做第二塊中的東西,它總是分配在堆上。

Dynamic =堆。非動態=堆棧。

永遠記得釋放你的記憶!

+2

真的嗎? http://ideone.com/S67G18 – kravemir 2013-03-16 19:28:20

+1

@Miro:它的工作原理是[可變長度數組](http://en.wikipedia.org/wiki/Variable-length_array)(這是第一個代碼片段要求的)是[由GCC作爲擴展支持](http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html)。它在標準C++中不受支持。 – 2013-03-16 19:32:14

+1

請理解,問題的第一部分中顯示的VLA是C99擴展,並且得到大多數現代編譯器的支持。 – 2013-03-16 19:32:20