Recentemente mi sono imbattuto nella rigida regola di aliasing, ma ho difficoltà a capire come usare void *
per eseguire punizioni di tipo senza infrangere la regola.Digitare punire con void * senza infrangere la rigida regola di aliasing in C99
So che questo rompe la regola:
int x = 0xDEADBEEF;
short *y = (short *)&x;
*y = 42;
int z = x;
E so che posso utilizzare in modo sicuro un sindacato in C99 per il tipo-giochi di parole:
union{
int x;
short y;
} data;
data.x = 0xDEADBEEF;
data.y = 42;
int z = data.x;
Ma come faccio a usare void *
in modo sicuro eseguire la punzonatura di tipo in C99? È la seguente corretta:
int x = 0xDEADBEEF;
void * helper = (void *)&x;
short *y = (short *)helper;
*y = 42;
int z = x;
ho il sospetto che il codice sarà ancora rompere la rigida regola aliasing in quanto la memoria all'indirizzo x
variabili 's può essere modificata sia da x
e Dereferenced y
.
Se il tipo di punzonatura non è definito tramite void *
, qual è lo scopo dello void *
in C99?
Oh capisco, quindi nei casi in cui verrebbe utilizzato 'void *', il programmatore dovrebbe già conoscere il tipo corretto da trasmettere; non viene eseguito alcun tipo di punteggiatura dal momento che viene utilizzato il tipo di dati originale (ad esempio 'int *' -> 'void *' -> 'int *'). –
Sì, esattamente. +1 –
Potrei sbagliarmi, ma non è solo 'char' che è autorizzato ad aliasare qualcosa, non' char unsigned'? – Arnout