Ma si può scavalcare questa cosa? Hai parlato di keyword fatte per specificare l' aliasing, e se io dichiaro il puntatore di tipo register?

codice:
char buffer[100];
register int* ptr=(int*)&buffer;
Perché in certi casi farebbe comodo avere un puntatore a int a un buffer di char.

E a proposito delle unioni:

L'alternativa in teoria non è usare le unioni; su praticamente ogni compilatore questo uso delle union è consentito, ma per lo standard è undefined behavior, poiché è consentito solo leggere dall'ultimo membro in cui si è scritto (le union in effetti nascono per poter avere qualche genere di polimorfismo in C, non per "reinterpretare" tipi in altra maniera).
codice:
typedef union
{
    int arr_i[4];
    double arr_d[2];
}myunion;
Supponendo che sulla mia macchina go gli interi di 4B e i double di 8B, se scirvo:

codice:
myunion un;
un.add_d[0]=4.0;
Da questo momento in poi non posso mai leggere arr_i[0]? Come scavalcare questa cosa? A volte usare la memcpy porta inefficienze più grandi se ho un buffer lunghissimo.