Описание тега flexible-array-member

Гибкие элементы массива - это функция C, представленная в C99, посредством которой можно объявить последний элемент массивом неопределенного размера.

Цитируется из N1570, 6.7.2.1 Спецификаторы структуры и объединения:

18 В качестве особого случая последний элемент структуры с более чем одним поименованным членом может иметь неполный тип массива; это называется гибким элементом массива. В большинстве случаев гибкий элемент массива игнорируется. В частности, размер структуры такой, как если бы элемент гибкого массива был опущен, за исключением того, что у него может быть больше завершающих отступов, чем это могло бы подразумеваться. Однако когда файл. (или ->) оператор имеет левый операнд, который является (указателем на) структуру с гибким элементом массива, и правый операнд называет этот член, он ведет себя так, как если бы этот член был заменен самым длинным массивом (с тем же типом элемента), что не сделало бы структуру больше, чем объект, к которому осуществляется доступ; смещение массива должно оставаться смещением гибкого элемента массива,даже если это будет отличаться от массива замены. Если в этом массиве не будет элементов, он будет вести себя так, как если бы в нем был один элемент, но поведение не определено, если предпринята какая-либо попытка получить доступ к этому элементу или сгенерировать указатель, следующий за ним.

20 ПРИМЕР 2 После объявления:

      structs { int n; double d[]; }; 

структура structs имеет гибкий элемент массива d. Типичный способ использования:

      int m = /* some value */;
      structs *p = malloc(sizeof (structs) + sizeof (double [m]));

и предполагая, что вызов malloc завершился успешно, объект, на который указывает p, в большинстве случаев ведет себя так, как если бы p был объявлен как:

      struct { int n; double d[m]; } *p;

(есть обстоятельства, при которых эта эквивалентность нарушается; в частности, смещения элемента d могут быть разными).