我已阅读Garbage value when passed float values to the function accepting integer parameters答案。我的问题更深入一点。我本来也可以问我有50多个声望点。我加入我的代码更多的澄清:将float传递给带int参数的函数(未事先声明)
#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,如果有帮助。
这是未定义的行为。不要试图将其推断出来。根据定义,它没有定义发生了什么。 – bolov
如果你想在调用者函数**之后定义一个函数,你必须在调用函数之前添加一个原型。这就是全部 – LPs
为了详细说明@LP所说的,没有这些,你的代码不再是_valid_ C代码了。 –