例如,我有動態大小的陣列基於用戶輸入:在哪裏創建動態大小數組? (堆棧或堆)
int n;
cin >> n;
int items[n];
這是陣列上堆分配?或者是它堆一樣,如果我寫:
int n, *items;
cin >> n;
items = new int[n];
...
delete [] items;
編輯:據我所知,第二個代碼做什麼。我問第一個代碼是否像第二個代碼一樣執行相同的操作,但使用的行數較少。
例如,我有動態大小的陣列基於用戶輸入:在哪裏創建動態大小數組? (堆棧或堆)
int n;
cin >> n;
int items[n];
這是陣列上堆分配?或者是它堆一樣,如果我寫:
int n, *items;
cin >> n;
items = new int[n];
...
delete [] items;
編輯:據我所知,第二個代碼做什麼。我問第一個代碼是否像第二個代碼一樣執行相同的操作,但使用的行數較少。
你的第一個例子中沒有使用動態數組在所有 - 它使用一個堆棧分配的變長數組(通常幕後相當於一個alloca
調用,除了sizeof
運算符),這是C99的一個功能,而不是C++。
你的第二個數組當然是通過new分配在堆上的。
請注意,標準C++不支持變長數組,因此第一個代碼片段在C99(無'iostream's)和C++(無VLA)中都將是語法錯誤。不過,有些編譯器支持C++中的VLA作爲擴展。 – 2013-03-16 19:29:32
@Insilico是正確的,但許多C++編譯器支持C99功能作爲擴展(至少GCC,Clang,也許MSVC)。 – 2013-03-16 19:30:15
@Insilico我會在沒有警告的情況下編譯。用g ++進行測試,沒有任何構建參數。 – kravemir 2013-03-16 19:32:47
您的第一個代碼塊將無法編譯,您無法使用new或malloc/calloc/realloc分配一個動態大小的數組。
爲了做你想做的事情,你需要做第二塊中的東西,它總是分配在堆上。
Dynamic =堆。非動態=堆棧。
永遠記得釋放你的記憶!
真的嗎? http://ideone.com/S67G18 – kravemir 2013-03-16 19:28:20
@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
請理解,問題的第一部分中顯示的VLA是C99擴展,並且得到大多數現代編譯器的支持。 – 2013-03-16 19:32:20
相關:http://stackoverflow.com/a/1169916/1141471 – sehe 2013-03-16 19:46:08