【发布时间】:2009-11-22 17:25:29
【问题描述】:
我知道这是错误,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 不同,尽管它们是相同的。
【问题讨论】:
-
几乎正确:参数按值传递,但将指针推入堆栈只会覆盖(提升的)64 位浮点值的下半部分
-
你应该发布你得到的实际输出。您是在暗示第二个 printf 实际上是在打印“123”或类似的东西吗?
标签: c pointers gcc floating-point printf