将超过必需参数传递给c函数

时间:2013-06-14 08:58:13

标签: c compilation callstack function-calls

如果我传递的参数多于函数所需的参数,会发生什么?我希望在被调用的函数中有一些东西被破坏,但是在一些小的测试代码中一切正常。

例如:

void print()
{
    int x=10;
    printf("%d\n",x);
}
void main()
{
    print(0,0,0,0,0);
}

3 个答案:

答案 0 :(得分:3)

这是未定义的行为。

  

(C99,6.5.2.2p6)“如果表示被调用函数的表达式具有不包含a的类型   原型,[...]如果参数的数量不等于数量           参数,行为未定义。

我们从6.9.1p7知道print函数不提供原型。

  

C99,6.9.1p7)“如果声明者包含参数类型列表,则           list还指定了所有参数的类型;这样的宣言员           也可以作为函数原型,以便以后调用同一个函数           在同一翻译单位。如果声明者包含标识符           列表,142)参数的类型应在a中声明           以下声明清单。“

由于没有违反约束,因此不需要诊断消息。

答案 1 :(得分:1)

在函数调用中,如果参数适合,编译器将决定将参数放入CPU寄存器中,否则,参数将转到STACK内存(http://www.technochakra.com/wp-content/uploads/assembly_stack.jpg)。

当您添加不存在的参数时,可能会导致未定义的行为,因为被调用的函数代码可能会错误对齐堆栈内存访问。换句话说,调用代码将使用函数内的预期布局的不同布局来编写堆栈。

答案 2 :(得分:-1)

将遇到编译错误。 我在visual c ++ 6.0中编译代码,编译输出:

error C2660: 'print' : function does not take 5 parameters