在C中缺少原型声明时,由于参数提升导致了奇怪的结果

Sam*_*iyi 0 c types prototype

我遇到了一个问题,可归纳如下,

#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

Pas*_*uoq 6

您正在观察的行为特定于基于堆栈的参数传递.对于默认编译64位x86代码且无法重现的人,可以尝试使用"gcc -m32"而不是"gcc".

使用基于堆栈的参数传递,t1()从堆栈中读取32位,这些32位碰巧形成浮点值2.0.在调用站点,因为t1没有原型,参数f被提升为,double并且它double是写在堆栈上的(C99 6.5.2.2:6"如果表示被调用函数的表达式具有不包括的类型一个原型,对每个参数执行整数提升,并且类型为float的参数被提升为double.这些被称为默认参数promotion").

没有理由t1从堆栈中恢复预期的值,因为它没有正确读取它的类型和宽度.