【问题标题】:Int and Float pointer. Can someone explain the outputInt 和 Float 指针。有人可以解释输出
【发布时间】:2016-04-05 08:44:14
【问题描述】:
    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

这是属于 c 未定义行为的东西吗?

【问题讨论】:

  • 是的,它是 UB。你期待什么输出?
  • 是的,有两个原因:1) 你违反了严格的别名规则 2) 你为 int 使用了错误的格式说明符 %f
  • 我假设只有第一个 printf 需要解释,但这完全取决于参数如何传递给函数,这取决于编译器模式和版本。可能值得注意的是,vs2015 甚至会产生使用错误输入参数的警告。

标签: c pointers floating-point


【解决方案1】:

好吧,你有一个&x,它拥有一个指向x的地址,同样还有一个p
然后你改变p的值,即。更改它指向x 只是现在取消引用p 时,字节被解释为浮点数。正如(可能)sizeof(int) != sizeof(float) 一样,甚至一些 Bytes 也被评估,而这些 Bytes 之前没有或相反。
因此,您正在访问 C 标准没有定义的内存,即。 UB。

此外,您还为*p 分配了一个新的浮点值,因此甚至可以写入这个曾经是int 的空间。
难怪在评估第一个 printf() 时,编译器会感到困惑——反正它是 UB。
第二条语句至少给了他不矛盾的指示:从int 打印int(不要试图将int 解释为float)。
第三个让你很幸运,因为正如我之前提到的,float 可能不适合int,因此这些值随时会被覆盖甚至导致 SEGFAULT。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 2020-05-29
    • 1970-01-01
    • 2011-06-27
    • 2012-01-09
    • 1970-01-01
    相关资源
    最近更新 更多