取消引用int但是转换为float会在C中打印任何内容

Dan*_*obe 1 c pointers casting

C Noob在这里尝试跟随一些在线讲座.在教授的例子中,他向我们展示了我们可以通过执行以下操作将存储在int中的数据作为float读取*(float*)&i.我尝试使用以下代码执行此操作但没有任何反应.我在这里测试http://ideone.com/ExmXSW

#include <stdio.h>

int main(void) {
    // your code goes here
    int i=37;
    printf("%f", *(float*)&i);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

M.M*_*M.M 6

这会导致未定义的行为:

  • 执行*(float *)&i违反了严格的别名规则
  • 使用了错误的格式说明符:%i是的int,但是你提供了一个float

当代码导致未定义的行为时,可能发生任何事情.建议你这样做的讲座是一个垃圾讲座,除非它特意将此作为不做的例子.通过这种方法说"我们可以读取存储在int中的数据作为浮点数"是不正确的.

NB.ideone.com不适合测试,因为它可以抑制大量的编译器错误消息,所以你可能认为你的代码是正确的,而事实上并非如此.