如果我传递的参数多于函数所需的参数,会发生什么?我希望在被调用的函数中有一些东西被破坏,但是在一些小的测试代码中一切正常。
例如:
void print()
{
int x=10;
printf("%d\n",x);
}
void main()
{
print(0,0,0,0,0);
}
答案 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