函式返回區域性變數的問題

2021-07-12 03:59:18 字數 1016 閱讀 1061

1. 返回區域性變數的值

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

int func()

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

int func()

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

vector func()

返回的是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在函式返回後已銷毀,結果將是不可預知的。

函式返回區域性變數的問題

1.函式可以返回區域性變數 當函式的區域性變數作為函式的返回值時,其實是不知道是誰 是程式?會自動生成乙個變數的副本即拷貝作為函式的返回值,而原有的區域性變數將被銷毀。注意函式不可以返回區域性變數的位址或者某個指標,以為當函式執行完了 這裡改咋說 系統會 這塊位址,因此這個位址裡面 的東西也就沒有意...

函式返回區域性變數

一般的來說,函式是可以返回區域性變數的。區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址 指標 的話,程式執行後會出錯。因為函式只是把指標複製後返回了,但是指標指向的內容已經被...

函式返回區域性變數

函式返回區域性變數 一般的來說,函式是可以返回區域性變數的。區域性變數的作用域 只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址 指標 的話,程式執行後會出錯。因為 函式只是把指標複製後返回了,...