Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

264
Vistas
¿Cuál es el fundamento de "la estructura con un miembro de matriz flexible no debe ser miembro de una estructura"?

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?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda