那為什么函數還可以把它return返回呢?
謝邀。
C語言函數的局部變量在函數執行完畢后,會被釋放,相信即使是C語言初學者,也是了解這一點的。不過,我們在函數中定義一個局部變量,卻是可以通過 return 語法將其返回給調用者的,這也許就是題主的疑惑之處。
C語言函數怎么可以把一個被釋放的值返回給調用者使用呢?
請看下面這張圖,進一步來說,C語言程序每調用一個函數,就會在棧區為其分配一塊區域,所有局部變量都是在這塊區域里存放的,函數執行完畢返回后,系統自動就將這塊區域收回了。
這塊區域較為正式的名字叫“棧幀”。
既然函數的局部變量都存放在棧區,棧區在函數返回就釋放了,那為什么 add 函數還能把局部變量返回呢?
其實函數返回的并不是局部變量,而是局部變量里面存放的數據
我們用鞋柜來比喻局部變量,用鞋子來比喻數據。我們想取出的是鞋子,而不是鞋柜,對嗎?
以我的機器為例,在函數執行完畢后,系統會先將返回值暫存在寄存器 eax 里,所以即使函數的棧幀被系統收回了,它的返回值依然在 eax 里保存的很好。函數返回后,系統再把返回值從 eax 中取出,賦值給調用者。請看下面這個例子:
我們查看它的匯編代碼,發現一切和我們預料的一致:
從匯編代碼可以看出,C語言的 return 實際上返回的是是將局部變量里的值,而不是直接返回局部變量。
不過,因為返回值是存放在局部變量里的,而局部變量被釋放了,所以必須再為該值找一個“容器”,該“容器”在本例中就是 eax 寄存器。
總結一下
題目所說的“C語言函數返回局部變量”這一過程是這樣的:在局部變量被釋放之前,C語言程序將存放在其中的值暫時存放到 eax 寄存器中,eax 是不會被釋放的,所以函數執行完畢后,return 仍然能將其中的值返回給調用者。
歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹C語言、linux等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。