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