【发布时间】:2019-01-19 15:45:51
【问题描述】:
以下代码是否违反严格别名?
int a = 0;
*((int *)((char *)&a)) = 1;
为什么不呢?因为我们最终会使用合法的int * 取消引用 int a 的指针
为什么是?因为我们将 char * 转换为 int * 并取消引用它(int *),这似乎是一个严格的别名违规
【问题讨论】:
-
AFAIR 可以使用
char *访问任何对象,而不会违反严格的别名规则。 -
为什么你认为
char *在这段代码中的某个时候被取消引用了? -
是的,但另一种方式(使用
int *别名char *)是有问题的
标签: c strict-aliasing