Объявление размера массива с непостоянной переменной
Я всегда думал, что при объявлении массива в С++ размер должен быть постоянным целочисленным значением.
Например:
int MyArray[5]; // correct
или
const int ARRAY_SIZE = 6;
int MyArray[ARRAY_SIZE]; // correct
но
int ArraySize = 5;
int MyArray[ArraySize]; // incorrect
Вот что объясняется в Язык программирования С++, Bjarne Stroustrup:
Число элементов массива, связанного с массивом, должно быть постоянным выражением (§С .5). Если вам нужны переменные границы, используйте вектор (§3.7.1, §16.3). Например:
void f(int i) {
int v1[i]; // error : array size not a constant expression
vector<int> v2(i); // ok
}
Но, к моему большому удивлению, приведенный выше код отлично компилируется в моей системе!
Вот что я пытался скомпилировать:
void f(int i) {
int v2[i];
}
int main()
{
int i = 3;
int v1[i];
f(5);
}
У меня нет ошибки!
Я использую GCC v4.4.0.
Есть ли что-то, что мне не хватает?
Ответы
Ответ 1
Это расширение GCC для стандарта: см. здесь.
Вы можете использовать параметр -pedantic
, чтобы заставить GCC выпустить предупреждение или -std=c++98
сделать ошибку при использовании одного из этих расширений (в случае, если переносимость является проблемой).
Ответ 2
Вы используете функцию из C99, которая называется VLA (массивы переменной длины). Было бы лучше, если вы скомпилируете свою программу следующим образом:
g++ -Wall -std=c++98 myprog.cpp
Ответ 3
Вы также можете использовать функцию alloca для получения эффекта, очень похожего на массивы переменной длины. Это доступно на VS тоже.
alloca - выделить память, которая автоматически освобождается Функция alloca() распределяет байты размера пространства в кадре стека вызывающей стороны. Это временное пространство автоматически освобождается, когда функция, вызвавшая alloca(), возвращается к своему вызывающему. Функция alloca() является machine- и зависит от компилятора. Для некоторых приложений его использование может повысить эффективность по сравнению с использованием malloc (3) плюс free (3).