Это действительно динамическое выделение памяти?

у меня есть этот код

int e;
scanf("%d",&e);
int ar[e];

это динамическое распределение? Это действительно похоже на то, что я могу выделять память во время выполнения.

Я использовал это, чтобы получить от пользователя ввод для количества элементов, а затем снова заполнить его пользователем.


person Hunar    schedule 15.05.2016    source источник
comment
С или С++? Выберите один.   -  person Baum mit Augen    schedule 15.05.2016
comment
Ваш код неправильно сформирован в соответствии со стандартом C++, но допустим в C99. Эти два языка очень отличаются.   -  person kfsone    schedule 15.05.2016


Ответы (3)


Это не совсем динамическое выделение памяти, как обычно понимается по смыслу этого термина.

Это называется массивом переменной длины. Размер массива известен только во время выполнения, поэтому память выделяется во время выполнения.

Однако, в отличие от библиотечных функций динамического выделения памяти (malloc()/calloc()), базовое выделение памяти зависит от компилятора. Например, gcc выделяет VLA в стеке.

Таким образом, главное отличие этого подхода (по сравнению с динамическим выделением памяти) заключается в том, что VLA находятся в автоматическом хранилище. Как только вы покинете область действия, она больше не будет доступна. Цитирование C11, глава §6.2.4

Для такого объекта, который имеет тип массива переменной длины, его время жизни простирается от объявления объекта до тех пор, пока выполнение программы не выйдет из области действия объявления. [...]

FWIW, это было введено в стандарте C99, но стало необязательным в C11.

И, насколько мне известно, C++ не поддерживает это как неотъемлемую часть стандарта, оно может быть доступно как расширение компилятора.

person Sourav Ghosh    schedule 15.05.2016

int ar[e] — это распределенный в стеке VLA (массив переменной длины), который недопустим в C++, но работает в C99. Когда блок заканчивается, он автоматически извлекается (освобождается).

https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

person Edward Karak    schedule 15.05.2016

Хотя в этом случае память выделяется во время выполнения, это не совсем динамическое выделение памяти. И имейте в виду, что динамически выделенная память должна освобождаться/освобождаться после ее использования.

Должно быть так (на С)

int e;
scanf("%d", &e);
/*dynamically allocate memory using malloc function*/
int* ar = (int*) malloc(e * sizeof(int));
...
...
...
/* release memory using free() function */
free(ar);
person Monirul Islam Milon    schedule 15.05.2016