如果我向函数传递的参数多于所需的参数,会发生什么?我预计被调用函数中的某些内容会被破坏,但在一些小测试代码中一切正常。
例如:
void print()
{
int x=10;
printf("%d\n",x);
}
void main()
{
print(0,0,0,0,0);
}
如果我向函数传递的参数多于所需的参数,会发生什么?我预计被调用函数中的某些内容会被破坏,但在一些小测试代码中一切正常。
例如:
void print()
{
int x=10;
printf("%d\n",x);
}
void main()
{
print(0,0,0,0,0);
}
这是未定义的行为。
(C99, 6.5.2.2p6) “如果表示被调用函数的表达式具有不包含原型的类型,[...] 如果参数的数量不等于参数的数量,则行为未定义。 "
我们从 6.9.1p7 中知道该print
函数不提供原型。
C99, 6.9.1p7) “如果声明器包含一个参数类型列表,该列表还指定了所有参数的类型;这样的声明器还可以作为函数原型,供以后在同一个翻译单元中调用同一个函数。如果声明器包括一个标识符列表,142) 参数的类型应在以下声明列表中声明。”
由于没有违反约束,因此不需要诊断消息。
在函数调用中,如果参数合适,编译器将决定将参数放入 CPU 寄存器中,否则,参数将进入堆栈内存(http://www.technochakra.com/wp-content/uploads/assembly_stack。 .jpg )。
当您添加不存在的参数时,可能会导致未定义的行为,因为调用的函数代码可能未对齐堆栈内存访问。换句话说,调用代码将使用函数内部预期布局的不同布局写入堆栈。
会遇到编译错误。我在visual c++ 6.0中编译代码,编译输出:
error C2660: 'print' : function does not take 5 parameters