[問題] 參數傳遞個數的問題..

作者: 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