函式裡面的區域性變數只是在函式裡面,一旦函式執行完畢,(棧)區域性變數的記憶體就會被釋放掉(堆需要程式猿手動釋放)。如果我們返回是值,那麼函式會將區域性變數值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.函式可以返回區域性變數 當函式的區域性變數作為函式的返回值時,其實是不知道是誰 是程式?會自動生成乙個變數的副本即拷貝作為函式的返回值,而原有的區域性變數將被銷毀。注意函式不可以返回區域性變數的位址或者某個指標,以為當函式執行完了 這裡改咋說 系統會 這塊位址,因此這個位址裡面 的東西也就沒有意...
函式返回區域性變數
一般的來說,函式是可以返回區域性變數的。區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址 指標 的話,程式執行後會出錯。因為函式只是把指標複製後返回了,但是指標指向的內容已經被...