Ответ 1
Инициализация гибкого элемента массива таким образом запрещена по стандарту C.
C11: 6.7.2.1 Спецификаторы структуры и объединения (p20-21):
21 ПРИМЕР 2 После объявления:
struct s { int n; double d[]; };
структура struct
s
имеет элемент гибкого массиваd
. [...]22 Следуя приведенному выше заявлению:
struct s t1 = { 0 }; // valid struct s t2 = { 1, { 4.2 }}; // invalid t1.n = 4; // valid t1.d[0] = 4.2; // might be undefined behavior
Инициализация
t2
недействительна (и нарушает ограничение), потому чтоstruct s
обрабатывается так, как если бы он не содержал членd
. [...]
Но GCC позволяет статическую инициализацию гибкого массива:
Руководство GCC: 6.17 Массивы нулевого нуля:
Вместо GCC разрешает статическую инициализацию элементов гибкого массива. Это эквивалентно определению новой структуры, содержащей исходную структуру, за которой следует массив достаточного размера для хранения данных. Например. в следующем,
f1
строится так, как если бы он был объявлен какf2
.struct f1 { int x; int y[]; } f1 = { 1, { 2, 3, 4 } }; struct f2 { struct f1 f1; int data[3]; } f2 = { { 1 }, { 2, 3, 4 } };