Для объединения запись в один элемент и чтение из другого члена (кроме массива char) - это UB.
//snippet 1(testing for endianess):
union
{
int i;
char c[sizeof(int)];
} x;
x.i = 1; // writing to i
if(x.c[0] == 1) // reading from c[0]
{ printf("little-endian\n");
}
else
{ printf("big-endian\n");
}
//snippet 2(swap bytes using union):
int swapbytes()
{
union // assuming 32bit, sizeof(int)==4
{
int i;
char c[sizeof(int)];
} x;
x.i = 0x12345678; // writing to member i
SWAP(x.ch[0],x.ch[3]); // writing to char array elements
SWAP(x.ch[1],x.ch[2]); // writing to char array elements
return x.i; // reading from x.i
}
Фрагмент 1 - это законный C или С++, но не фрагмент 2. Правильно ли я? Может ли кто-нибудь указать на раздел стандарта, где он говорит, что его ОК, чтобы написать члену союза и прочитать от другого члена, который является массивом char.