2015-04-24 2 views
-1

Динамическое распределение памяти в C/C++ происходит через malloc и распределение статической памяти ex: int a[3];, выделенное после выполнения кода.C/C++ Динамическое или статическое распределение памяти?

Но этот код int x[y+1]; может произойти только после того, как значение присваивается y, и это происходит во время выполнения, поэтому его статические, динамические или и то, и другое? компилятор автоматически вставляет malloc в машинный код?

+2

Замечание: 'int x [y + 1]' недопустимо C++ (хотя большинство компиляторов его поддерживают), оно действителен только в C. – vsoftco

ответ

4

Это является переменной длиной Array (VLA). Wikipedia: http://en.wikipedia.org/wiki/Variable-length_array

Технически это не является законным в C++, но компиляторы часто поддерживают его как расширение, но генерируют предупреждения, когда они включены. См Why aren't variable-length arrays part of the C++ standard?

Это законно в С.

+0

Обратите особое внимание на сноска о его включении в C99 и последующем выводе на условный элемент, который не требуется поддерживать (стандарт C11, раздел 6.7.6.2 - 4) Например, см. последний бесплатный проект: [** Языки программирования - C, международный стандарт (Комитет Проект N1570, 12 апреля 2011 г.) **] (http://www.open-std.org/ JTC1/SC22/WG14/WWW/документы/n1570.pdf) –

0

int[] находится на стеке, а malloc 'd или new' d вещи находятся на куче.

ОЧЕНЬ в основном int[] получает выделение автоматически, когда оно достигнуто (где y уже известно), и его отбрасывают, когда он выходит из сферы действия. Это еще не все, что было выделено при запуске.

Нет сокровенных звонков или вещей, таких как работа памяти стека.

(я надеюсь на ответ от кого-то, кто на самом деле знает, C/C++)

-1

int x[y+1] не может случиться, как вы думаете об этом. У вас может быть только int x[SOME_CONSTANT_HERE]. Если бы y было объявлено const, это сработало бы.

Это потому, что в C/C++ нет магии. Элементы с файловыми областями будут распределяться только во время компиляции, а локальные элементы будут вставлены в стек стек & (как упоминалось Фелк) по мере их поступления и (т. е. когда выполнение входит и выходит из блока). Но последнее не динамическое распределение в том, как вы думаете об этом, через malloc(); это (пользовательский) стек.

(Примечание: очевидно, некоторые компиляторы C99 позволят вам объявить массив с переменным размером , если массив является локальной переменной и создается таким образом в стеке пользователя. Это определенно ошибка, если вы попытаетесь сделать это с переменной в области файлов.)

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