向 c 函数传递超过必需的参数

vpi*_*lai 3 c callstack compilation function-calls

如果我传递的参数多于函数所需的参数,会发生什么情况?我预计被调用函数中的某些内容会被损坏,但在一些小型测试代码中一切正常。

例如:

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

oua*_*uah 5

这是未定义的行为。

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

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

C99, 6.9.1p7) “如果声明符包含参数类型列表,则该列表还指定所有参数的类型;这样的声明符还可以用作以后调用同一翻译单元中的同一函数的函数原型。如果声明符包括标识符列表,142)参数的类型应在以下声明列表中声明。”

由于不存在约束违规,因此不需要诊断消息。

  • @vpillai undefined 是未定义的,但带有“gcc”的程序集转储显示它们被推入堆栈中。 (4认同)
  • @ouah 参数的去向取决于 ABI。在我的 x86_64 上,它们在寄存器中传递。 (2认同)