Есть ли способ объявить переменную размера другой переменной в C ++? - PullRequest
0 голосов
/ 23 апреля 2020

Мне действительно нужно сделать что-то подобное в моем коде: char str [var + 1]; но я знаю, что вы можете поставить только константу между []. Поэтому я просто спрашиваю, есть ли способ сделать то, что мне нужно.

Ответы [ 2 ]

6 голосов
/ 23 апреля 2020

В C ++ можно объявить только переменную с постоянным размером времени компиляции.

Однако массивы Dynami c могут иметь размер Dynami c. Самый простой способ создать массив динамического c - использовать std::vector, или в случае символьной строки вы можете использовать std::string. Пример:

 std::string str(var+1, '\0');
1 голос
/ 23 апреля 2020

Вопрос изначально включал тег 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 могут иметь последствия для безопасности при использовании стека ядра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...