2012-11-20 62 views
1

我是初學者,所以如果我超出了任何規則,我很抱歉。這是我的問題。C中功能的默認參數 -

我在代碼塊上使用GCC編譯器,並且有一些特殊的東西我注意到了一段特定的代碼。我希望有人能夠闡明這一點。

int main() 
{ 
Tree *t; 
//some operations on the tree 
traverse();// No parameter is passed here. 
... 
} 

void traverse(Tree *t) 
{ 
.. 
} 

在以下代碼中,函數traverse()正確執行。我的問題是爲什麼?我不確定這一點,但如果一個函數沒有聲明,它的默認類型就變成了int。現在,編譯器不僅在編譯時抑制了錯誤,還正確地將參數't'提供給了函數traverse()。

這是因爲智能編譯器的設計?

所以一般來說:我的問題是 - 如果遇到尚未聲明的方法,編譯器會默認使用哪些行爲?更重要的是,它如何「知道」我想傳遞哪個參數?

對於您所知道的,我可能有三個「Tree *」實例:t1,t2和t3。那編譯器會通過哪一個呢?

我試着在Google上尋找,但尚未找到明確的來源。

謝謝你的時間。 :)

+1

這是不正確的,只有偶然的「作品」。 C沒有默認參數。 – chill

回答

3

函數正在堆棧上查找它的參數。該函數不知道它所期望的參數實際上並不存在。

偶然地,它正在尋找參數的堆棧中的東西是您的main()函數中的局部變量t。如果你在main()裏有更多的局部變量,那麼他們中的一個會被誤解爲函數的參數,並且事情會發生嚴重錯誤。

所以,它純粹是偶然的。

+0

謝謝。是的,這就是我所懷疑的。 – Kanishk

+0

但有一個問題。你提到的這個「堆棧」。在計算過程中存儲變量的是什麼棧?我的意思是,我知道有這樣的堆棧: 1)函數調用(調用堆棧)(顯然不在圖中)和 2)這個堆棧用於彙編級指令。你提到的#2「堆棧」是什麼?程序的彙編代碼運行時實現的堆棧? – Kanishk

+0

答案指的是激活堆棧,也稱爲調用堆棧。這是一個抽象,而不是內存中的實際堆棧(儘管它的某些部分實際上存儲在實際堆棧中的內存中)。每次調用一個函數(包括對main的初始調用)時,包含本地變量和一些其他信息(例如調用位置)的激活記錄被壓入激活堆棧。 – ibid