1

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

例如:

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

3 回答 3

4

这是未定义的行为。

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

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

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

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

于 2013-06-14T09:00:05.850 回答
1

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

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

于 2013-06-14T11:33:29.670 回答
-1

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

error C2660: 'print' : function does not take 5 parameters
于 2013-06-14T09:06:56.100 回答