2009-05-21 11 views
19

Si tengo una unión, el estándar C garantiza que la unión se alineará con el tamaño del elemento más grande.Alineación del elemento de unión

union U { 
    long l; 
    int i; 
    short s; 
    char c[2]; 
} u; 

Pero, ¿qué dice acerca de la alineación de elementos de unión individuales dentro de la unión? ¿Se garantiza que la siguiente expresión es verdadera?

(&u.l == &u.i) && (&u.i == &u.s) && (&u.s == &u.c[0]) 
+6

un recordatorio para tener en cuenta lo que la norma no decir 'U.I. y 0xFF == uc [0] 'o el byte de orden bajo de que no se garantiza que sea c [0] (orden de bits) puede – Spudd86

Respuesta

23

El inicio de cada elemento está alineado con la dirección de la unión misma.

por lo que las comparaciones individuales en la expresión de preguntar acerca son verdaderas, pero la expresión en su conjunto es falso a menos que la unión se encuentra en la dirección 0x0001.

El texto eliminado se aplica a las siguientes comparaciones:

&u.l == &u.i == &u.s == &u.c[0] 

La versión revisada se compara distintos tipos de puntero - los punteros deben ser emitidos a punteros void.


me pidieron que citar la norma - o identificar la sección de la norma.

C99 - sección 6.7.2.1 Estructura y unión especificadores (párrafo 14):

Un puntero a un objeto unión, adecuadamente convertidos, los puntos a cada uno de sus miembros (o si un miembro es un campo de bits, luego a la unidad en la que reside) y viceversa.

+3

Usted hace referencia a la parte relevante de la norma por favor? –

Cuestiones relacionadas