函式裡放的區域性變數和返回值都存放在棧區,當函式結束以後,裡面的區域性變數的記憶體將被釋放(即變數的值清除了),那麼return 返回的值在函式結束以後如何傳給呼叫這個函式的變數??
return的原理是:
被調函式執行結束後才會返回主調函式,但是被調函式執行結束後系統為被調函式中的區域性變數分配的記憶體空間就會被釋放。也就是說,return 返回的那個值在被調函式執行一結束就被釋放掉了,那麼它是怎麼返回給主調函式的呢?
事實上在執行 return 語句時系統是在內部自動建立了乙個臨時變數,然後將 return 要返回的那個值賦給這個臨時變數。所以當被調函式執行結束後 return 後面的返回值真的就被釋放掉了,最後是通過這個臨時變數將值返回給主調函式的。而且定義函式時指定的返回值型別實際上指定的就是這個臨時變數的型別。
這也是為什麼當 return 語句中表示式的型別和函式返回值型別不一致時,將 return 的型別轉換成函式返回值型別的原因。return 語句實際上就是將其後的值賦給臨時變數,所以它要以臨時變數的型別為準,即函式返回值的型別。
注意:1、c/c++裡返回值是複製出去的,而對於大的物件,複製的代價很高。
2、有些物件是不能複製的,至少編譯器不知道怎麼複製,比如陣列。
char
*example()
;return a ;
}int
main()
;//static char a = 靜態也可以,定義在靜態區
return a ;
}int
main()
這樣可以輸出字串,因為example裡定義的是字串常量,字串常量在常量區,常量區在整個程式中都一直存在,不會釋放,函式返回的是常量區的位址。
結論:return都是通過乙個臨時變數作中介,被調函式結束以後,棧區記憶體被釋放,臨時變數的值賦給主函式中的變數,適用於其他型別(int等等),若是指標型,則還需要考慮,位址是在哪個記憶體區域,除了棧區記憶體,其他記憶體不會被釋放。
C語言 return的解釋
1 學習背景 今天發現不論是帶返回值還是不帶返回值的函式中都可以寫return 2 解釋 i return 表示把程式流程從被調函式轉向主調函式並把表示式的值帶回主調函式,實現函式值的返回,返回時可附帶乙個返回值,由return後面的引數指定。如 double add double a double...
return不能返回指向棧記憶體的指標
棧是臨時的 當跳出棧時,其指標對應的值被下次壓棧替換掉 可能每次出棧時,系統可能會對剛才壓棧的記憶體初始化 include uisng namespace std char getstring int main 此程式中,return返回的是指向棧記憶體的位址,程式編譯警告,因為給該內存在函式結束時...
解釋activity棧 activity的載入模式
activity棧 activity棧是乙個先進先出 包含所有正在執行的activity的佇列。乙個activity的狀態,對於開發者來說是無法控制的,是由系統決定的。那麼activity是按照什麼邏輯來運作的呢,這就要了解activity棧了,每個activity的狀態都是由它在activity棧...