Это не точно динамическое распределение памяти, как это обычно понимается в смысле этого термина.
Это называется variable length array. Размер массива известен только во время выполнения и, следовательно, память выделяется во время выполнения.
Однако, в отличие от функций библиотеки распределения динамической памяти (malloc()
/calloc()
), базовое распределение памяти зависит от компилятора. Например, gcc
выделяет VLA в стеке.
Таким образом, основное отличие в этом подходе (по сравнению с динамической памятью) заключается в том, что VLA находятся в автоматическом хранилище. Как только вы покинете область действия, она больше не будет доступна. Цитирование C11
, глава §6.2.4
Для такого объекта, который действительно имеет тип переменной длины массива, срок службы простирается от декларирование объекта до выполнения программы не оставляет сферу декларации. [...]
FWIW, это было введено в C99
стандарт, только чтобы быть необязательной в C11
.
И AFAIK, C++
не поддерживает это как неотъемлемую часть стандарта, он может быть доступен как расширение для компилятора.
C или C++? Выберите один. –
Ваш код плохо сформирован в соответствии со стандартом C++, но является законным на C99. Эти два языка * очень разные. – kfsone