Alineación de elementos de unión
alignment unions (1)
El inicio de cada elemento está alineado con la dirección de la propia unión.
por lo tanto, las comparaciones individuales en la expresión que usted pregunta son verdaderas, pero la expresión en su conjunto es falsa a menos que la unión se encuentre en la dirección 0x0001.
El texto eliminado aplica a las siguientes comparaciones :
&u.l == &u.i == &u.s == &u.c[0]
La versión revisada compara distintos tipos de punteros: los punteros se deben convertir para anular los punteros.
Me pidieron que citara la norma, o identificar la sección de la norma.
C99 - sección 6.7.2.1 Especificadores de estructura y unión (párrafo 14):
Un puntero a un objeto de unión, adecuadamente convertido, apunta 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.
Si tengo una unión, el estándar C garantiza que la unión misma estará alineada con el tamaño del elemento más grande.
union U {
long l;
int i;
short s;
char c[2];
} u;
Pero, ¿qué dice sobre la alineación de los elementos individuales de la unión 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])