Я делаю следующее для инициализации массива в C ++
int a;
cin>>a;
float b[a];
Это работает и компилируется на моем компьютере. Это правильно? Я думал, что мы можем сделать это только если a const int.
От вас зависит определение «правильности».
Это называется массив переменной длины (или просто VLA) и он официально не поддерживается в текущих версиях C ++ (100% уверен для C ++ 03 и ранее, 99,99% уверен для C ++ 11), но это в C.
Некоторые компиляторы допускают это как расширение компилятора.
Дело не в том, является ли a константой int. Речь идет о том, имеет ли a начальное значение, назначенное во время компиляции. Компилятор должен распределять память в соответствии с const int
значение. Стандарт C ++ не поддерживает массив переменной длины прямо сейчас.
В C99 этот синтаксис массива переменной длины допустим, но стандарт C ++ говорит, что нет. Это очень полезная функция, позволяющая компилятору распределять все ресурсы памяти.
В GCC и Clang эта функция поддерживается как расширение компилятора, поэтому вы не получите никаких предупреждений и ошибок. Но компилятор MSVC поместит сообщение об ошибке, которое говорит cannot allocate an array of constant size 0
Так что это зависит от компилятора.
Компилятор, поддерживающий эту функцию, может преобразовать ваш код с помощью new
оператор.
int a;
cin>>a;
float *b = new float[a];
Это действительно в стандарте C ++.
Другое дело, что хотя он называется массивом переменной длины, он вообще не является переменной длины. Как только он определен, его длина является постоянным значением, которое никогда не изменяется. Вы не можете расширить или уменьшить это.
Гораздо лучше использовать vector
контейнер, который действительно переменная длины, и с гораздо большей масштабируемостью и адаптивностью.
Смотрите пост для дальнейшего обсуждения Почему массивы переменной длины не являются частью стандарта C ++?