У меня есть следующий код:
...
int n;
cin >> n;
int numbers[n];
...
Это скомпилировало с NetBeans на Mac с помощью g ++ (я думаю), и это не скомпилировало использование VS2008 в Windows. Почему настолько трудно заставить его работать с каждым компилятором? Размер массива известен прежде, чем выделить его.
Править: Я знаю о std::vector
. На самом деле это было частью присвоения домашней работы, и я запустил ее на работе над Mac, затем возвратился домой и был удивлен, что она не работала над VS2008. Спасибо за все ответы. Но я все еще нахожу это логичным это, если компилятор может сгенерировать некоторый код как alloc(123)
где значение 123 является hardcoded, почему это не может генерировать что-то как alloc(n)
где Вы добираетесь n
от адреса памяти, который содержит int n
или что-то. Просто кажется более логичным позволить что-то вроде этого по умолчанию.
Хотя размер массива известен до того, как он будет выделен, он все еще не известен до времени выполнения. Это известно как массив переменной длины (VLA) и представляет собой C99ism, поддерживаемый в g ++ расширением, которое включено по умолчанию. Чтобы быть точным, это не соответствует C ++ 98/03, и поэтому Visual C ++ имеет полное право отклонить его.
Если вы действительно хотите динамическое определение размера во время выполнения, выделите память в куче (через new []). Это будет работать везде и в качестве бонуса защитит вас от переполнения стека.
почему бы не использовать в cpp реальные вещи, такие как std::vector
для этого
Нечто подобное можно сделать с помощью
int* numbers = (int*)alloca(n * sizeof(int)); // equivalent to int numbers[n]
. Это не рекомендуемая функция, но при осторожном использовании дает точно такой же результат.
По книге размерность массива должна быть постоянным выражением, значение которого больше или равно единице. Постоянное выражение в смысле целочисленных буквальных констант, перечислителей или константных объектов целочисленного типа, которые сами инициализируются из константных выражений. Неконстантная переменная, значение которой неизвестно до времени выполнения, не может использоваться для указания размера массива.
Но версия компилятора, которую я использую, позволяет то, о чем вы упомянули.
Потому что размер массива должен быть постоянной времени компиляции в стандартном C ++ (см. 8.3.4 §1).