我遇到了一个问题,可归纳如下,
#include <stdio.h>
int main()
{
float f=23.45;
printf("main: %f\n", f);
t1(f);
/* the result would be
main:23.450001
t1:2.000000 */
}
void t1(float f)
{
printf("t1: %f\n", f);
}
Run Code Online (Sandbox Code Playgroud)
我现在知道奇怪的行为是由于缺少原型声明而且因此提升了参数(float-> double?),我仍然无法弄清楚为什么结果是2.000000,所以有人能给出更详细的解释吗?我使用的是ubuntu10.04 gcc4.4.3
您正在观察的行为特定于基于堆栈的参数传递.对于默认编译64位x86代码且无法重现的人,可以尝试使用"gcc -m32"而不是"gcc".
使用基于堆栈的参数传递,t1()从堆栈中读取32位,这些32位碰巧形成浮点值2.0.在调用站点,因为t1没有原型,参数f被提升为,double并且它double是写在堆栈上的(C99 6.5.2.2:6"如果表示被调用函数的表达式具有不包括的类型一个原型,对每个参数执行整数提升,并且类型为float的参数被提升为double.这些被称为默认参数promotion").
没有理由t1从堆栈中恢复预期的值,因为它没有正确读取它的类型和宽度.