C11, 6.7.2.1 Especificadores de estructura y unión, Restricciones, 3 (énfasis añadido):
Una estructura o unión no debe contener un miembro con tipo de función o incompleto (por lo tanto, una estructura no debe contener una instancia de sí misma, pero puede contener un puntero a una instancia de sí misma), excepto que el último miembro de una estructura con más de un miembro nombrado puede tener un tipo de matriz incompleto; dicha estructura (y cualquier unión que contenga, posiblemente recursivamente, un miembro que sea tal estructura) no será miembro de una estructura o elemento de una matriz.
Justificación de C, Revisión 5.10, abril de 2003 (énfasis agregado):
De manera similar, las estructuras que contienen arreglos flexibles no pueden ocurrir en otras estructuras o en arreglos.
Entonces, Justificación para C no proporciona una justificación. ¿Cuál es la razón?
Una estructura con un miembro de matriz flexible solo se puede usar correctamente si se asigna dinámicamente. Por ejemplo:
struct s1 { int a; int b; int c[]; }; ... struct s1 *x = malloc(sizeof(struct s1) + 5 * sizeof(int)); Supongamos un relleno de estructura típico y sizeof(int)==4 . Eso haría sizeof(struct s1)==8 .
Ahora imagine si tal estructura fuera miembro de otra estructura:
struct s2 { int a; struct s1 b; int c; }; El miembro b de la struct s2 comenzaría en el desplazamiento 4. Pero, ¿qué pasa con el miembro c ? Dado que sizeof(struct s1)==8 , eso haría que el miembro c tuviera un desplazamiento de 12. Pero entonces no hay forma de que el miembro b tenga espacio reservado para el miembro c que lo contiene.
Debido a que el desplazamiento de un miembro de estructura dado se establece en el momento de la compilación, no hay forma de asignar espacio para el miembro de matriz flexible c dentro de la struct s1 .
En teoría, si la estructura con un miembro de matriz flexible fuera el último miembro:
struct s2 { int a; int b; struct s1 c; }; Entonces podría funcionar, pero entonces significa que la struct s2 también está sujeta a las mismas reglas que una estructura con un miembro de matriz flexible, lo que provoca un efecto en cascada. Esto haría más difícil determinar qué estructuras están sujetas a esta regla.
Por lo tanto, una estructura con un miembro de matriz flexible no está permitida como miembro de otra estructura o matriz.