Вопрос изначально включал тег C и C ++, этот ответ для C
в C, var
может быть непостоянным для стандартов поддержки VLA (c99 и дополнительная поддержка в c11)
В C действует следующее (см .: https://godbolt.org/z/kUockA)
int var=3;
char str[var+1];
Однако VLA не определены в стандарте C ++ (см .: { ссылка }) и не рекомендуется использовать в C.
Поскольку VLA обычно распределяются в стеке, и если значение var
не контролируется выделением str
может дать сбой, и восстановление такого сбоя может быть затруднено. Кроме того, они могут поощрять создание крайне небезопасного кода (если нужно сделать арифметику указателя c для переменной, выделенной в стеке).
Была инициатива сделать код ядра linux свободным от VLA ( см .: https://www.phoronix.com/scan.php?page=news_item&px=Linux-Kills-The-VLA):
Использование массивов переменной длины может добавить незначительные издержки времени выполнения к коду из-за необходимости определения размер массива во время выполнения.
VLA внутри структур не поддерживается компилятором LLVM Clang и, следовательно, проблема для тех, кто хочет собрать ядро вне G CC, Clang поддерживает только VLA в стиле C99.
Возможно, наиболее важно то, что VLA могут иметь последствия для безопасности при использовании стека ядра.