關於函式返回值的一些理解

2021-06-11 07:16:45 字數 1675 閱讀 8615

前面看了幾篇關於函式返回值的帖子,覺得學多了高階程式語言,還是有必要對一些底層的只是需要了解一些

下面我總結了一些,肯定是不全,還望大家給予指正o(∩_∩)o~

當我們使用乙個被調函式的時候,return的時候分為兩個情況,乙個是返回數值,乙個就是指標(或者引用)

當我們返回數值的時候,編譯通過,沒有問題,輸出結果也沒有問題,如下**是通過測試的

#include int sum(int a,int b)

int main(void)

解析:主調函式(也就是main函式)呼叫sum函式的時候,sum函式的區域性變數s就是兩個實參的副本的和,是存放在棧裡面的,此時會進行乙個壓棧的操作

當呼叫函式結束的時候,也就是return了,此時區域性變數就會隨著函式的結束被銷毀,但是銷毀的是s,數值會通過副本傳回主函式,也就是進行了乙個出棧的操作

其實實質也就是傳回了該值的乙個副本,也就是兩個數的和,這是乙個實實在在的數字

所以執行結果是ok的

但是如果當我們想要返回乙個指標的時候,就會出現問題的

比如以下的**

#include char*getmemory(void)

int main(void)

解析:之前在別的地方看到乙個很形象的解釋,就是你去旅遊,覺得當地的一家酒店的飯菜很有特色,於是就記下了它的位址門牌號之類的(相當於指標),當你回去之後,也就是函式呼叫完畢,返回這個指標是沒有問題的,你回去之後是依然可以看這個位址門牌號的,但是當一段時間再去上次旅遊的地方,可能那家酒店已經不存在了,可能變成了一家理髮店或者其他什麼的

所以,當函式呼叫結束,指標所指向的內容是存放在棧的,會隨著函式一起銷毀的,但是指標還是存在的,只不過此時指標指向的內容不確定,所以結果是會出錯的(跟上面傳值回來是一回事,傳遞乙個指標的副本回主調函式,但是該指標是指向被調函式的區域性變數,該區域性變數是已經隨著被調函式已經銷毀掉的,所以這時指指標的指向是不確定的,至少是未知的,所以容易出現錯誤)

但是通過其他方法我們可以避免對指標返回的錯誤

比如延長指標的生命期,將其設定為靜態變數,使其生命期延長至整個檔案

或者設定成乙個字串的常量,讓其存放在靜態區中也是可以的

實現的**如下

#include char *getmemory(void)

int main(void)

#include char *getmemory(void)

int main(void)

關於函式返回值作用域的一些思考

函式中的變數的作用域只能是在這個函式內,在arc環境內,例如,uiview methodview的作用域只能在這個函式內,所以按理說應該在函式結束後就會將view的記憶體計數減一,但是實際上並不是這樣,如下測試 void viewdidload uiview method 輸出的view的寬度是10...

Socket一些函式相關的返回值

若無錯誤發生,recv 返回讀入的位元組數。如果連線已中止,返回0。否則的話,返回socket error錯誤,應用程式可通過wsagetlasterror 獲取相應錯誤 如無錯誤發生,listen 返回0。否則的話,返回socket error錯誤,應用程式可通過wsagetlasterror 獲...

關於signal函式的返回值

include include include typedef void signal handler int 定義乙個signal handler函式指標型別 signal handler signal int signo,signal handler sig handler 宣告乙個signal...