15 As a special case, the last element of a structure with more than one named member may
have an incomplete array type. This is called a flexible array member, and the size of the
structure shall be equal to the offset of the last element of an otherwise identical structure
that replaces the flexible array member with an array of unspecified length.95) When an
lvalue whose type is a structure with a flexible array member is used to access an object,
it behaves as if that member were replaced with the longest array, with the same element
type, that would not make the structure larger than the object being accessed; the offset of
the array shall remain that of the flexible array member, even if this would differ from
that of the replacement array. If this array would have no elements, then it behaves as if it
had one element, but the behavior is undefined if any attempt is made to access that
element or to generate a pointer one past it.
六、参考资料
ISO/IEC C Programming Language Standard(C89:1990)
https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
https://www.geeksforgeeks.org/flexible-array-members-structure-c/