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

2021-06-20 07:44:45 字數 2641 閱讀 3865

函式裡面的區域性變數只是在函式裡面,一旦函式執行完畢,(棧)區域性變數的記憶體就會被釋放掉(堆需要程式猿手動釋放)。如果我們返回是值,那麼函式會將區域性變數值copy並返回。如果是指標,那麼函式就會直接返回指標,如果在這種情況下呼叫,就會出現錯誤,因為記憶體已經被釋放了。下面一一來舉例說明這個問題。

#includeusing namespace std;

int myfoo()

int main()

這個寫法是沒有問題的,myfoo執行完之後a的記憶體會被釋放掉,函式會拷貝a的值並返回,所以主函式的a和myfoo裡面的a不是同乙個位址。

(gdb) p &a

$15 = (int *) 0x7fffffffe58c

(gdb) p a

$16 = 8

(gdb) p &a

$17 = (int *) 0x7fffffffe5ac

(gdb) p a

$18 = 8

通過gbd可以看到函式體裡面的a的位址和返回結果的a的位址是不一樣的。

#includeusing namespace std;

char* myfoo()

int main()

在這個例子中,"hello, i'm string constant"是乙個字串常量,存在文字常量區。函式會講字串首位址返回,那麼在主函式裡面也可以直接使用。

$ g++ -g char.cpp  -o char

char.cpp: in function 『char* myfoo()』:

char.cpp:6:12: warning: deprecated conversion from string constant to 『char*』 [-wwrite-strings]

編譯會報警,從字串常量轉換成char*

通過gbd來檢視記憶體位址,可以看出二者記憶體位址都是0x40095c

(gdb) p a

$2 = 0x40095c "hello, i'am string constant"

main () at char.cpp:13

13cout << "return is " << a << endl;

(gdb) p a

$3 = 0x40095c "hello, i'am string constant"

#includeusing namespace std;

char* myfoo()

int main()

這個case是非法的。myfoo裡面的a是乙個棧區域性變數,函式執行完畢,a的記憶體會被釋放掉,如果在主函式裡面直接使用會報錯。

$ g++ char_local.cpp  -g -o char_local

char_local.cpp: in function 『char* myfoo()』:

char_local.cpp:6:7: warning: address of local variable 『a』 returned [enabled by default]

gcc編譯則會報警,顯示是乙個區域性變數,其實看到這個,我們就知道我們**有問題。在通過gdb進一步檢視。

(gdb) p &(a[0])

$2 = 0x7fffffffe570 "hello, i'm char local"

(gdb) p a

$3 = 0x7fffffffe570 "\200b\255\367\377\177"

&(a[0])就是取字串首字元的位址,可以看到在myfoo裡面是有值的,但是在main函式裡面,可以看到記憶體已經被釋放了。變成空了。

#include#include#include#includeusing namespace std;

char* myfoo()

int main()

通過malloc申請的變數在堆區,需要程式設計師自己釋放(也是記憶體洩露的原因之一),myfoo執行完了,記憶體沒有被釋放,所以這樣使用不會有問題。

(gdb) p a

$1 = 0x602010 "hello, i am malloc"

(gdb) p a

$2 = 0x602010 "hello, i am malloc"

可以看到myfoo和main裡面的位址都是一樣的。

#includeusing namespace std;

char* myfoo()

int main()

static變數作用域是全域性,所以肯定沒問題。直接gdb檢視可以驗證。

(gdb) p &(a[0])

$2 = 0x601050 "hello, i'm static"

(gdb) p a

$3 = 0x601050 "hello, i'm static"

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

1.返回區域性變數的值 可以有兩種情況 返回區域性自動變數和區域性靜態變數,比如,int func 區域性變數temp儲存在棧中,函式返回時會自動複製乙份temp的copy給呼叫者,沒有問題。int func 區域性變數a儲存在靜態 全域性 儲存區中,從初始化後一直有效直到程式結束,僅分配一次記憶體...

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

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

函式返回區域性變數

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