int x; float *p;
p = (float*)&x;
*p = 2.35;
printf("x:%f\n",x); //0.0000
printf("x:%d\n",x); //1075209830
printf("p:%f\n",*p); //2.350000
这是否属于未定义的行为?
答案 0 :(得分:0)
嗯,您&x
的地址指向x
,地址指的是p
。
然后你改变p
的值,即。改为它指向x
现在,当解除引用p
时,字节被解释为float。因为(可能)sizeof(int) != sizeof(float)
甚至一些字节被评估为之前或之前没有。反之。
所以你正在访问内存,C标准没有定义,即。 UB。
此外,您为*p
分配了一个新的浮动值,因此即使写入此区域,该区域曾是int
。
毫无疑问,在评估第一个printf()
时,编译器会感到困惑 - 无论如何它都是UB。
至少第二个陈述给出了非矛盾的指示:从int
打印int
(而不是试图将int
解释为float
)。
第三个让你很幸运,因为正如我之前提到的,float
可能不适合int
,因此值随时被覆盖甚至导致SEGFAULT。