如果我向一个函数传递比所需参数更多的参数会发生什么?我原本期望被调用的函数中会出现一些错误,但在一些小的测试代码中一切都运行正常。
例如:
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)则参数的类型应在随后的声明列表中声明。”
由于不存在约束违规,因此不需要诊断消息。
gcc
的汇编转储显示它们被推送到栈中。 - ouaherror C2660: 'print' : function does not take 5 parameters
()
声明或定义函数。应该始终使用(void)
来表示空参数列表。这样你的好编译器会立刻提示你犯了错误。 - Jens Gustedtint
,因此可能会发生非常奇怪的事情。 - Jens Gustedt