In C99, 6.7.8/3:
Тип инициализируемого объекта должен быть массивом неизвестного размера или типом объекта, который не является типом массива переменной длины.
6.6/2:
Константное выражение может оцениваться во время трансляции, а не во время выполнения.
6.6/6:
Целочисленное константное выражение должно иметь целочисленный тип и должно иметь только операнды, являющиеся целочисленными константами, константы перечисления, символьные константы, выражения sizeof, результаты которых являются целочисленными константами, и константы с плавающей запятой, являющиеся непосредственными операндами приведения типов.
6.7.5.2/4:
Если размер представляет собой целочисленное константное выражение, а тип элемента имеет известный постоянный размер, тип массива не является типом массива переменной длины; в противном случае тип массива является типом массива переменной длины.
a
имеет тип массива переменной длины, потому что size
не является целочисленным константным выражением. Таким образом, он не может иметь список инициализаторов.
В C90 нет VLA, поэтому код незаконен по этой причине.
В C++ также нет VLA, но вы можете сделать size
const int
. Это потому, что в C++ вы можете использовать const int
переменных в ICE. В Си нельзя.
Предположительно, вы не предполагали, что a
имеет переменную длину, поэтому вам нужно:
#define size 5
Если вы действительно хотели, чтобы a
имела переменную длину, я полагаю, вы могли бы сделать что-то вроде этого:
int a[size];
int initlen = size;
if (initlen > 5) initlen = 5;
memcpy(a, (int[]){1,2,3,4,5}, initlen*sizeof(int));
Или, может быть:
int a[size];
for (int i = 0; i < size && i < 5; ++i) {
a[i] = i+1;
}
Однако трудно сказать, что здесь «должно» произойти в случае, когда size != 5. На самом деле не имеет смысла указывать начальное значение фиксированного размера для массива переменной длины.
person
Steve Jessop
schedule
11.03.2010
-std=c99
при компиляции с помощью GCC, чтобы включить массивы переменного размера. - person Mikael S   schedule 11.03.2010ISO C90 forbids variable length array 'a'
. - person Steve Jessop   schedule 11.03.2010