нулевой длины массивы не допускаются в С. статически типизированных массивы должны иметь фиксированный, ненулевой размер, который является постоянным выражением, и переменной длины-массивы должны иметь размер, который оценивает ненулевое значение; С11 6.7.6.2/5:
каждый раз, когда он [выражение размера] вычисляется оно должно иметь значение больше нуля
Однако, С99 и С11 имеют понятие гибкого массива член из структуры:
struct foo
{
int a;
int data[];
};
от С11, 6.7.21/18:
В качестве особого случая последний элемент структуры с более чем одним именованным элементом может иметь , имеющий неполный тип массива; это называется элементом гибкой матрицы. В большинстве ситуаций элемент гибкого массива игнорируется. В частности, размер структуры выглядит так, как если бы элемент гибкой решетки был исключен, за исключением того, что он может иметь более длинную прокладку, чем , что подразумевает упущение. Однако, когда оператор .
(или ->
) имеет левый операнд, который представляет собой (указатель на) структуру с гибким членом массива и именами правого операнда, который имеет член , он ведет себя так, как если бы этот элемент был заменен самым длинным массивом (с тем же типом типа ), который не сделает структуру больше, чем объект, к которому обращаются;
Это не должно даже компилироваться, поскольку «i' не является константой времени компиляции. – Jashaszun
попробуйте компилировать это; gcc выйдет, ударит вас, расстрелят и украдут вашу машину. –
[Ребята ...это C99 ... не C89.] (http://ideone.com/NKtfJD) – Cornstalks