[问题] 参数传递个数的问题..

楼主: HowLeeHi (处处留心皆正妹)   2014-12-25 05:39:04
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
GCC
问题(Question):
最近在复习C语言时看到了一个习题上的问题
程式码如下
int foo();
int bar();
int main(void)
{
foo(2, 3, 4);
return 0;
}
int foo(int a, int b)
{
return bar(a);
}
int bar(int c, int d)
{
int e = c + d;
return e;
}
我用gcc居然可以编译成功没有错误讯息也没有warning...
foo原型宣告里面没有宣告参数,后面有宣告2个
然后呼叫bar函数居然也没有错误
我转成组合语言看了一下后,第一次call foo 虽然有把3个参数搬到暂存器去
但是foo函数里面只有接收到前2个参数,也就是2跟3
然后在call bar时,只有传2这一个参数过去
但是在bar里面计算c+d时,居然又用到了2跟 另一个暂存器(值为3)
也就是在 bar里面 变量e是5
最后觉得会错误的程式码居然可以编译成功,但程式流程又很怪异
整个不太能理解它的行为..
作者: PkmX (阿猫)   2014-12-25 08:57:00
int foo(); 在C是一个宣告不定参数的函数如果要宣告一个没有参数的函数 要用int foo(void);如果你开-Wstrict-prototypes就会出现这个warning了(-Wstrict-prototypes不包含在-Wall -Wextra里面)不过gcc/clang -Wall -Wextra -pedantic和clang的staticanalyzer都抓不出后面的错误是还蛮扯的=.=

Links booklink

Contact Us: admin [ a t ] ucptt.com