gpt4 book ai didi

c - 奇怪的结果打印指针作为 C 中的 float

转载 作者:太空宇宙 更新时间:2023-11-04 00:15:58 25 4
gpt4 key购买 nike

我知道这是错误的,并且 gcc 会给你一个警告,但为什么它有效(即数字打印正确,有一些舍入差异)?

int main() {
float *f = (float*) malloc(sizeof(float));
*f = 123.456;
printf("%f\n", *f);
printf("%f\n", f);
return 0;
}

编辑:是的,我在 32 位机器上使用 gcc。我很想知道使用其他编译器会得到什么结果。

我按照 Christoph 的建议多做了一些事情:

int main() {
float *f = (float*) malloc(sizeof(float));
*f = 123.456;
printf("%f\n", f); // this
printf("%f\n", *f);
printf("%f\n", f); // that
return 0;
}

这导致第一个 printf 打印出与最后一个 printf 不同的值,尽管它们是相同的。

最佳答案

重新排序 printf() 语句,您会发现它不再有效,因此 GCC 绝对不会在您背后修复任何东西。

至于它为什么有效:由于变量参数的默认参数提升,您实际上会在第一次调用时传递一个 double。由于您系统上的指针似乎是 32 位的,因此第二次调用仅覆盖 64 位浮点值的下半部分。

关于您修改后的示例:

  • 第一次调用将打印一个 double 值,其中高 32 位是垃圾,指针 f 的低位值
  • 第二次调用打印提升为 double 的*f
  • 第三次调用打印一个 double 值,高 32 位来自 (double)*f(因为这些位仍然保留在最后一次调用的堆栈中);与第一种情况一样,低位将再次来自指针 f

关于c - 奇怪的结果打印指针作为 C 中的 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1779338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com