函式呼叫棧的問題

根本停不下來發表於2018-08-10

函式呼叫棧的問題

當程式執行上述程式碼的時候,程式不會有任何問題。

但是當我們執行下邊的程式碼的時候,程式就會崩潰。

函式呼叫棧的問題

什麼原因呢?棧不夠用了!

函式呼叫棧的問題

分析一下彙編程式碼: 當 test 被呼叫的時候:

  1. push 入棧
  2. sp 指標sub,減0x20。即 sp 暫存器的值減 32 。(棧空間是從高地址向低地址的)(sp 暫存器裡面儲存的值是棧頂的地址)
  3. sp 指標 add,加0x20。即 sp 暫存器的值加 32 ,恢復到之前的數值。
  4. 函式返回。

所以,這個 test 每次被呼叫的時候都會佔用 32 位元組的棧空間,函式返回之前,它會恢復。因為我們遞迴呼叫它一直沒有返回,所以會導致棧不夠用。


有的函式時不會有棧空間的。

葉子函式--最後一個函式,它不會再呼叫其它的函式。

相關文章