Int和Float指针。有人可以解释输出

时间:2016-04-05 08:44:14

标签: c pointers floating-point

    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

这是否属于未定义的行为?

1 个答案:

答案 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。