我有这样的双重功能:
double f(){
double value=0.1234;
return value;
}
在另一个功能中,我收到了值并打印出来。
printf("%f",f());
我希望看到打印的值为0.1234,而是打印了0。 如果我像这样投出类型:
printf("%f",(double)f());
会打印一个非常奇怪的值,例如-147923499.34。
经过一些检查(print sizeof)后,我发现f()返回的值是4个字节,而double类型应该是8个字节。
那么,这个的根本原因是什么?如何从函数中返回正确的double值?
答案 0 :(得分:9)
听起来你在没有范围原型的情况下调用了f()
。在C89中,编译器通过假设f
返回int
来对此作出反应。如果f
的实现实际上没有返回int
,那么行为是未定义的。
在C ++和C99中,自C99以来,必须至少对此代码发出警告。检查你的编译器输出,我建议你注意任何警告信息,如果没有,请调高警告级别。
要修复代码,请编写原型:
double f(void);
在调用函数之前。将原型放在头文件中是正常的,头文件由调用函数的代码和实现该函数的代码包括在内。然后编译器将检测调用和实现之间的不匹配。