【发布时间】:2013-06-14 08:58:12
【问题描述】:
如果我向函数传递的参数多于所需的参数,会发生什么?我预计被调用函数中的某些内容会损坏,但在一些小测试代码中一切正常。
例如:
void print()
{
int x=10;
printf("%d\n",x);
}
void main()
{
print(0,0,0,0,0);
}
【问题讨论】:
-
也许这回答了你想要的:stackoverflow.com/questions/51032/…
-
作为一种习惯,在 C 中从不使用
()声明或定义函数。对于空参数列表,始终使用(void)。然后你善良的编译器会急切地向你解释你做错了什么。 -
Also C11 6.11“未来语言方向”将此标记为过时的行为,可能无法在 C 标准的未来版本中编译。
"The use of function declarators with empty parentheses (not prototype-format parameter type declarators) is an obsolescent feature." -
@JensGustedt 啊!好点子。但是,当我使用图书馆时,这并不适用。基本上,如果 print 是作为没有头文件的 .o 提供的,那么我仍然可以使用许多参数调用 print 并链接它。
-
@vpillai,在任何给定架构上具体发生的情况取决于该架构使用的调用约定。例如,有些可能会将所有参数放在堆栈上,有些则具有第一个参数(如果类型足够)可以将它们传递到硬件寄存器中。在这两种情况下,您都可能会遇到麻烦,因为一端可能会访问另一端没有预料到的东西。还要记住,如果不知道原型,所有“窄”类型的参数都会扩展为
int,所以可能会发生非常奇怪的事情。
标签: c compilation callstack function-calls