【发布时间】:2017-03-02 07:52:02
【问题描述】:
我已阅读Garbage value when passed float values to the function accepting integer parameters 的答案。我的问题更深入一点。我也可以问我有超过 50 的声望点。我正在添加我的代码以获得更多说明:
#include <stdio.h>
#include <string.h>
void p2(unsigned int tmp)
{
printf("From p2: \n");
printf("tmp = %d ,In hex tmp = %x\n", tmp, tmp);
}
int main()
{
float fvar = 45.65;
p1(fvar);
p2(fvar);
printf("From main:\n");
printf("sizeof(int) = %lu, sizeof(float) = %lu\n", sizeof(int),
sizeof(float));
unsigned int ui;
memcpy(&ui, &fvar, sizeof(fvar));
printf("fvar = %x\n", ui);
return 0;
}
void p1(unsigned int tmp)
{
printf("From p1: \n");
printf("tmp = %d ,In hex tmp = %x\n", tmp, tmp);
}
输出是:
From p1:
tmp = 1 ,In hex tmp = 1
From p2:
tmp = 45 ,In hex tmp = 2d
From main:
sizeof(int) = 4, sizeof(float) = 4
fvar = 4236999a8
将float 值传递给预先声明的带有int 参数的函数(即p2)会得到正确的结果。当尝试对未事先声明的函数(即 p1)进行相同操作时,会给出不正确的值。而且我知道编译器不会为之前未声明的函数假定任何类型或参数的原因。这就是为什么在 p2 的情况下float 值不会被类型转换为int。
我的困惑是,在 p2 的情况下,float 值究竟如何被复制到本地 int 变量 tmp。
如果它是“逐位复制”,那么读取这些位置应该至少产生十六进制的东西(除了 1)(如果不是整数)。但这听起来不像输出显示的那样。我知道浮点表示是不同的。
p2 如何读取浮点数未复制到的寄存器/堆栈位置?正如链接问题中的 simonc 所建议的那样?
我已经包含了int 和float 的大小,如果有帮助的话,我的编译器是 gcc。
【问题讨论】:
-
这是未定义的行为。不要试图推理它。根据定义,它没有定义会发生什么。
-
如果你想在调用函数之后定义一个函数你必须在调用函数之前添加一个原型。就是这样
-
详细说明@LPs 所说的,没有那个,你的代码就不再是一个有效的 C 代码了。
-
另外看看compiler errors
-
您正在尝试调用尚未声明的函数,因此它会自动声明为
int p1()。即使您稍后将其定义为void p1(unsigned int tmp),它也已被声明为int p1()(不带任何参数)。我很确定编译器会为此发出警告和错误,这些错误不应被忽略。
标签: c