Niedawno natknąłem się na regułę ścisłego aliasingu, ale mam problem ze zrozumieniem, jak używać typu void *
do wykonywania typowania bez naruszania reguły.Wpisz wykrawanie z pustką * bez łamania zasady ścisłego aliasingu w C99
Wiem, że to łamie zasadę:
int x = 0xDEADBEEF;
short *y = (short *)&x;
*y = 42;
int z = x;
I wiem, że mogę bezpiecznie korzystać z unii w C99 dla typu paronomazja:
union{
int x;
short y;
} data;
data.x = 0xDEADBEEF;
data.y = 42;
int z = data.x;
Ale jak mogę używać void *
bezpiecznie wykonać typowanie w C99? Jest następujący poprawne:
int x = 0xDEADBEEF;
void * helper = (void *)&x;
short *y = (short *)helper;
*y = 42;
int z = x;
Podejrzewam, że kod będzie nadal złamać ścisłe reguły aliasingu, ponieważ w pamięci pod adresem zmienne x
„s mogą być modyfikowane zarówno x
i dereferencjonowane y
.
Jeśli cienie są niezdefiniowane przez void *
, jaki jest cel funkcji void *
w C99?
Och, widzę, więc w przypadkach, w których użyty zostanie 'void *', programista powinien już znać prawidłowy typ do obsadzenia; nie stosuje się żadnego typowania, ponieważ używany jest oryginalny typ danych (tzn. 'int *' -> 'void *' -> 'int *'). –
Tak, dokładnie. +1 –
Mogę się mylić, ale czy to nie jest tylko "char", który może pseudonimować, a nie 'unsigned char'? – Arnout