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