Это неверный код, потому что массивы переменной длины не может иметь размеры, равные 0. В вашем примере, файл-сфера переменная n
инициализируется 0.
Этот массив
int a[n];
имеет нулевой размер, потому что переменная n
была инициализирована нолем как статическая продолжительность хранения.
Чтобы получить действительную программу, вы должны написать что-то вроде следующего
#include <stdio.h>
int n;
void f(void){n=2;}
void g(void){int b[n]; printf("sizeof(b) = %zu\n", sizeof(b)); }
int main(void)
{
f();
int a[n];
printf("sizeof(a) = %zu\n", sizeof(a));
g();
}
Примите во внимание, что VLA (s) были введены в C99 и в то же время Standard подавленной типа возвращаемого по умолчанию int
функций ,
Он не компилируется ('2: ошибка: изменено с изменением 'c' в области видимости файла). – cremno
n - 0 во время компиляции, а int c [n] будет массивом нулевой длины, потому что структуры разрешаются во время компиляции. –
Поскольку структурам ядра часто приходится пережить вызовы, которые их повышают, казалось бы, ограниченная полезность, даже если она выделена в стек ядра (в любом случае, ограниченного размера). Couse, глобальный VLA не имеет смысла (или компиляции), во всяком случае :( –