【发布时间】:2014-08-04 11:39:54
【问题描述】:
关于类型双关的问题:为什么这段代码违反了严格的别名规则:
int main()
{
int a = 1;
short j;
printf("%i\n", j = *((short*)&a));
return 0;
}
这不是:
int main()
{
int a = 1;
short j;
int *p;
p=&a;
printf("%i\n", j = *((short*)p));
return 0;
}
由gcc -fstrict-aliasing 构建。
谢谢!
【问题讨论】:
-
因为a和j是指向同一个内存的不同类型?
-
两者都有。编译器不保证会发出警告。尝试不同的混叠检测类型(
-Wstrict-aliasing=n,其中 n 为 1、2 或 3)。
标签: c gcc strict-aliasing