2013-12-20 7 views
2

я делаю следующее для инициализации массива в C++Инициализация массива

int a; 
cin>>a; 
float b[a]; 

Это работает и компилирует в моем компьютере. Это верно? Я думал, что мы можем сделать это только в том случае, если a был const int.

+0

Это расширение компилятора, хотя он скоро придет в ТС. Используйте '-pedantic (-errors)'. – chris

+0

@chris не могли бы вы рассказать, как я новичок в этом и не понял вашего ответа. Могу ли я продолжить кодирование с помощью такого рода инициализации? – Karthik

+2

В ответе подробно рассматривается большинство из них. Предполагая, что вы используете GCC или Clang, вы можете скомпилировать с '-pedantic', чтобы получить предупреждение, а VLA приходят на C++ в технической спецификации в 2014 году. – chris

ответ

1

В зависимости от вас, выражение "correct".

Это называется переменной длины массива (или просто VLA), и это официально не поддерживается в текущей версии C++ (100% уверен, что для C++ 03 и до, 99,99% уверен, что для C++ 11), но он находится в C.

Некоторые компиляторы допускают это как расширение компилятора.

+0

Где находится 0,01%? – texasbruce

+0

@texasbruce - :) Я не читал новый стандарт. _Все же_. :) –

1

Это не о том, является ли константа int. Речь идет о том, имеет ли начальное значение значение, присваиваемое при суммировании. Компилятор должен выделить хранилище в соответствии со значением 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, который действительно является переменной длины и обладает гораздо большей масштабируемостью и адаптивностью.

Смотрите пост для более подробного обсуждения на Why aren't variable-length arrays part of the C++ standard?

Смежные вопросы