Для объединения запись в один элемент и чтение из другого члена (кроме массива 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.
