Подтвердить что ты не робот

Объявление размера массива с непостоянной переменной

Я всегда думал, что при объявлении массива в С++ размер должен быть постоянным целочисленным значением.

Например:

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.

Есть ли что-то, что мне не хватает?

4b9b3361

Ответ 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).