Недавно я столкнулся с строгим правилом псевдонимов, но у меня возникли проблемы с пониманием того, как использовать void *
для выполнения функции punning без нарушения правила.
Я знаю, что это нарушает правило:
int x = 0xDEADBEEF;
short *y = (short *)&x;
*y = 42;
int z = x;
И я знаю, что могу безопасно использовать объединение в C99 для ввода типа:
union{
int x;
short y;
} data;
data.x = 0xDEADBEEF;
data.y = 42;
int z = data.x;
Но как я могу использовать void *
для безопасного выполнения пиратства типа на C99? Правильно ли это:
int x = 0xDEADBEEF;
void * helper = (void *)&x;
short *y = (short *)helper;
*y = 42;
int z = x;
Я подозреваю, что код будет по-прежнему нарушать правило строгой псевдонижирования, поскольку память с переменным адресом x
может быть изменена как с помощью x
, так и с помощью y
.
Если тип-punning равен undefined через void *
, какова цель void *
в C99?