C函数调用中的参数提升

时间:2010-05-31 11:46:10

标签: integer-promotion

我从----了解到默认促销何时启动:默认参数促销是在参数的预期类型未知时使用,也就是说当没有原型或参数是可变参数时。 / p>

但令我困惑的一个例子是:

void func(char a, char b)
{
    printf("a=%p,b=%p\n",&a,&b);    
}

int main(void)
{
    char a=0x11,b=0x22;

    func(a,b);

    return 0;
}

在上面的例子中很清楚:当在main中调用func时,不需要提升参数a和b,但输出显示& a =& b +4 not& a =& b +1。如果没有促销,为什么两个CHAR参数之间有4个字节?

1 个答案:

答案 0 :(得分:1)

因为编译器就像这样做: - )

通过查看地址,您无法推断参数是否已经被提升。 不要求参数在堆栈上以衔接方式传递(或者甚至根本就将它们传递到堆栈上)。

编译器(以及您平台的调用约定)可能指定堆栈始终保持4字节对齐,但这是特定于实现的细节,而不是C语言标准的一部分。