Ответ 1
Не это. C++ не имеет массивов переменной длины, хотя некоторые компиляторы допускают его как расширение языка.
Я использую MinGW для компиляции для С++ 11, и я узнал, что это не вызывает ошибку:
int S;
cin>>S;
char array[S];
Хотя это делает ("размер хранилища" массив "неизвестен"):
char array[];
Для меня размер также неизвестен в первом случае, так как он зависит от того, что пользователь вводит.
Насколько я знаю, автоматические массивы выделяются во время компиляции в стеке памяти. Так почему бы первый пример не сработал?
Не это. C++ не имеет массивов переменной длины, хотя некоторые компиляторы допускают его как расширение языка.
У меня недостаточно репутации для комментариев, поэтому я использую ответ. Пожалуйста, не будь жестоким ко мне :-)
Вы, видимо, не знаете о GNU GCC расширениях массивов переменной длины. Поэтому ваш первый код компилируется.
Сообщение об ошибке - это нечто иное. Вы должны указать длину массива.
gcc
имеет переключатель -pedantic
- включение этого переключателя компилятор сообщает ваш первый код как недействительный:
предупреждение: ISO C++ запрещает массив массивов переменной длины
Читайте также эту тему Какова цель использования -pedantic в компиляторе GCC/G++?
Используйте очень осторожные расширения компилятора, потому что если вы портируете свой код на другой компилятор, тогда у вас большие проблемы.
[Это отвечает на исходную версию вопроса, который задал вопрос о статическом массиве; Дедупликатор исправил это заблуждение, но теперь вопрос не содержит части.]
Если ваше предположение о том, что этот фрагмент кода определил статический массив, были правильными, вы бы действительно задались вопросом: что-то, что определено во время компиляции, например данные со статической продолжительностью хранения, очевидно, не зависит от ввода пользователя при запуске время. Этот трюизм не зависит от какого-либо конкретного языка.
Массив, определенный в вашем фрагменте кода, имеет, напротив, автоматическую продолжительность хранения, в стеке создается "вульга". Полный минимальный рабочий пример сделал бы яснее: он показал бы, что код находится в функции.
Объекты с автоматической продолжительностью хранения могут быть созданы по мере необходимости во время выполнения; нет никакой логической проблемы, препятствующей этому, что должно устранить вашу общую головную боль ;-).
Но обратите внимание, что, как правильно заметил один программист-чувак, стандартный C++, тем не менее, не позволяет определять массивы, размер которых неизвестен во время компиляции; стандарт C, хотя, начиная с C99. Обоснование C++ не соответствует этой поправке в том, что C++ предоставляет лучшие средства для использования, такие как векторный шаблон. gcc, который является компилятором, используемым в MinGW, разрешает это как расширение (и почему нет - он доступен в компиляторе в любом случае).