我最近遇到了严格的别名规则,但我无法理解如何在void *
不违反规则的情况下执行类型双关语。
我知道这违反了规则:
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
。
如果 type-punning 未定义 via ,那么C99void *
中的目的是什么?void *