2016-05-15 4 views
-2

У меня есть этот кодДействительно ли это динамическое распределение памяти?

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

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

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

+7

C или C++? Выберите один. –

+4

Ваш код плохо сформирован в соответствии со стандартом C++, но является законным на C99. Эти два языка * очень разные. – kfsone

ответ

5

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

Это называется variable length array. Размер массива известен только во время выполнения и, следовательно, память выделяется во время выполнения.

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

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

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

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

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

2

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

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

0

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

Это должно быть, как это (в C)

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); 
Смежные вопросы