函式返回的幾種情況

2021-08-11 06:13:55 字數 1374 閱讀 1562

1. 返回區域性變數的值

可以有兩種情況:返回區域性自動變數和區域性靜態變數,比如,

int func()

區域性變數temp儲存在棧中,函式返回時會自動複製乙份temp的copy給呼叫者,沒有問題。

int func()

區域性變數a儲存在靜態(全域性)儲存區中,從初始化後一直有效直到程式結束,僅分配一次記憶體,並且函式返回後,變數不會銷毀,沒有問題。

vectorfunc()

返回的是v的值拷貝,沒有問題。

person func()

返回的也是值拷貝,會呼叫person類的拷貝建構函式,沒有問題。

2. 返回區域性變數的指標

int* func()

前面討論過,區域性變數temp儲存在棧中,函式返回時將已銷毀變數的位址返回給呼叫者,結果將是不可預知的。

int* func()

區域性變數temp儲存在靜態儲存區,返回指向靜態儲存區變數的指標是可行的。

char* func()

對於字串的特殊情況,由於字串test儲存在常量儲存區(不是靜態儲存區),因此函式返回乙個指向常量的字串指標是可行的。

char* func()

這種情況下,str被初始化為字串區域性變數,因此函式返回乙個已銷毀的區域性變數是不可行的。解決辦法就是將字串str宣告為static。

char* func()

這種情況下,函式返回乙個指向堆記憶體的指標,由於堆儲存區由程式設計師手動管理,因此這種做法是可行的,但是要防止出現記憶體洩露,函式呼叫完後需要手動釋放記憶體。這裡的sizeof作用於指標返回的是指標型別的長度1byte,而如果作用於陣列返回的則是陣列的長度。

char *temp = null;

temp = func();

// some operation...

free(temp);

3. 返回區域性變數的引用

int& func()

由引用的概念可知,函式返回的是temp本身,而temp在函式返回後已銷毀,結果將是不可預知的。

補充:靜態全域性變數和全域性變數的區別

靜態全域性變數只在當前檔案中可用,全域性變數在其他檔案中也可用,需要用extern宣告。

全域性變數和靜態變數如果沒有手動初始化,則預設由編譯器初始化為0。

函式返回值的幾種情況

在乙個函式的內部,return 的時候返回的都是乙個拷貝,不管是變數 物件還是指標都是返回拷貝,但是這個拷貝是淺拷貝。1.如果返回乙個基本型別的變數,比如 int a a 5 return a 那麼就會 a的乙個拷貝,即 5返回,然後 a就被銷毀了。儘管 a被銷毀了,但它的副本 5還是成功地返回了,...

關於函式返回值的幾種情況

在乙個函式的內部,return 的時候返回的都是乙個拷貝,不管是變數 物件還是指標都是返回拷貝,但是這個拷貝是淺拷貝。1.如果返回乙個基本型別的變數,比如 int a a 5 return a 那麼就會 a的乙個拷貝,即 5返回,然後 a就被銷毀了。儘管 a被銷毀了,但它的副本 5還是成功地返回了,...

關於函式返回值的幾種情況

在乙個函式的內部,return的時候返回的都是乙個拷貝,不管是變數 物件還是指標都是返回拷貝,但是這個拷貝是淺拷貝。1.如果返回乙個基本型別的變數,比如 int a a 5 return a 那麼就會 a的乙個拷貝,即 5返回,然後 a就被銷毀了。儘管 a被銷毀了,但它的副本 5還是成功地返回了,所...