2013-03-16 2 views
1

Например, у меня есть массив с динамическим размером на основе пользовательского ввода:Где создаются массивы динамического размера? (Стек или кучи)

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

ли этот массив выделяется на стеке? Или это на куче, как если бы я написал:

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

Edit: Я понимаю, что второй код делает. Я спрашиваю, делает ли первый код то же самое, что и второй, но с меньшим количеством строк.

+0

related: http://stackoverflow.com/a/1169916/1141471 – sehe

ответ

5

Ваш первый пример не использует динамический массив на всех - он использует в стеке выделяется массив переменной длины (обычно за кадром эквивалентен вызову alloca, за исключением оператора sizeof), который является особенностью C99, а не C++.

Ваш второй массив, конечно, выделяется на кучу через новое.

+6

Обратите внимание, что массивы переменной длины не поддерживаются в стандартном C++, поэтому первый фрагмент кода будет синтаксической ошибкой как в C99 (без 'iostream'), так и в C++ (без VLA). Тем не менее, некоторые компиляторы поддерживают VLA в C++ как расширение. –

+0

@Insilico правильно, но многие компиляторы C++ поддерживают функции C99 как расширение (по крайней мере, GCC, Clang и, возможно, MSVC). –

+1

@Insilico Я скомпилирую без предупреждения. Протестировано с g ++ без каких-либо параметров сборки. – kravemir

1

используется new для выделения памяти, так что ваш массив хранится в куче

+0

Я спрашиваю, что стоит за массивами динамического размера, а не тем, что делает второй код :) – kravemir

+2

Да, куча - это то, что служит основой Хранить для массивов с динамическим размером в этом случае. Что еще вы хотели бы знать? –

+0

Если вы создаете массив без «новых» или динамических функций выделения памяти, с постоянным размером, то он сохраняется в стеке. Если вы выделяете память для своего массива (а размер также может быть неконстантным выражением), то он находится в куче. – nabroyan

-1

Ваш первый блок кода не сможет скомпилировать, вы не можете выделить массив с динамическим размером без использования выделения памяти с помощью нового или malloc/calloc/realloc.

Для того, чтобы сделать то, что вы хотите, вам нужно будет делать то, что у вас есть во втором блоке, которое всегда будет выделено на куче.

Динамический = Куча. Нединамический = стек.

Всегда помните, что освобождайте память!

+2

Действительно ??? http://ideone.com/S67G18 – kravemir

+1

@Miro: он работает, потому что [массивы переменной длины] (http://en.wikipedia.org/wiki/Variable-length_array) (это то, что требуется для первого фрагмента кода). [поддерживается GCC как расширение] (http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html). Он не поддерживается в стандартном C++. –

+1

Обратите внимание, что VLA, показанная в первой части вопроса, является расширением C99 и поддерживается большинством современных компиляторов. –

Смежные вопросы