Почему разрешено объявлять автоматический массив с размером в зависимости от ввода пользователя?

Я использую MinGW для компиляции для С++ 11, и я узнал, что это не вызывает ошибку:

int S;
cin>>S;
char array[S];

Хотя это делает ("размер хранилища" массив "неизвестен"):

char array[];

Для меня размер также неизвестен в первом случае, так как он зависит от того, что пользователь вводит.

Насколько я знаю, автоматические массивы выделяются во время компиляции в стеке памяти. Так почему бы первый пример не сработал?

Ответ 2

У меня недостаточно репутации для комментариев, поэтому я использую ответ. Пожалуйста, не будь жестоким ко мне :-)

Вы, видимо, не знаете о GNU GCC расширениях массивов переменной длины. Поэтому ваш первый код компилируется.

Сообщение об ошибке - это нечто иное. Вы должны указать длину массива.

gcc имеет переключатель -pedantic - включение этого переключателя компилятор сообщает ваш первый код как недействительный:

предупреждение: ISO C++ запрещает массив массивов переменной длины

Читайте также эту тему Какова цель использования -pedantic в компиляторе GCC/G++?

Используйте очень осторожные расширения компилятора, потому что если вы портируете свой код на другой компилятор, тогда у вас большие проблемы.

Ответ 3

[Это отвечает на исходную версию вопроса, который задал вопрос о статическом массиве; Дедупликатор исправил это заблуждение, но теперь вопрос не содержит части.]

Если ваше предположение о том, что этот фрагмент кода определил статический массив, были правильными, вы бы действительно задались вопросом: что-то, что определено во время компиляции, например данные со статической продолжительностью хранения, очевидно, не зависит от ввода пользователя при запуске время. Этот трюизм не зависит от какого-либо конкретного языка.

Массив, определенный в вашем фрагменте кода, имеет, напротив, автоматическую продолжительность хранения, в стеке создается "вульга". Полный минимальный рабочий пример сделал бы яснее: он показал бы, что код находится в функции.

Объекты с автоматической продолжительностью хранения могут быть созданы по мере необходимости во время выполнения; нет никакой логической проблемы, препятствующей этому, что должно устранить вашу общую головную боль ;-).

Но обратите внимание, что, как правильно заметил один программист-чувак, стандартный C++, тем не менее, не позволяет определять массивы, размер которых неизвестен во время компиляции; стандарт C, хотя, начиная с C99. Обоснование C++ не соответствует этой поправке в том, что C++ предоставляет лучшие средства для использования, такие как векторный шаблон. gcc, который является компилятором, используемым в MinGW, разрешает это как расширение (и почему нет - он доступен в компиляторе в любом случае).