main()調用test()方法,返回a的地址,可是a是test()的局部變量,所以在test()調用結束以後,test()的棧空間就被移除,a的儲存空間被釋放,即便保存了指向a的指針,也沒法得到10. 第一次能獲得10的緣由是編譯器優化保留了一次數據。ios
#include <iostream> using namespace std; int* test(); int main(){ int *p = test(); cout<< *p <<endl; cout<< *p <<endl; //答案是10 0 } int* test(){ int a = 10; return &a; }
2.字符串和char*的表現c++
從這個實驗裏,發現string的地址是沒有變化的,即便函數執行完畢,也能得到正確的值。數組
解釋:字符串是存在靜態區內的而非函數棧內,消亡的方式與普通變量不同,因此依舊能夠正確獲取其值函數
char*與上個例子的變量同樣,出來就沒了。優化
#include <iostream> #include <string> using namespace std; string test(); char* test1(); int* test2(); int main() { string p = test(); cout << "變量string的地址" << &p << endl; cout << p << endl; cout << p << endl; char* p1 = test1(); printf("變量char數組的地址%p\n", p1); cout << "char數組的值" << *p1 << endl; cout << "char數組的值" << *p1<< endl; /** 結果是 變量string在函數裏的地址0x6ffe00 變量string的地址0x6ffe00 helloworld helloworld 變量char在函數中的地址00000000006ffdc0 變量char數組的地址00000000006ffdc0 char數組的值 char數組的值 **/ } string test() { string a = "helloworld"; cout << "變量string在函數裏的地址\n" << &a << endl; return a; } char* test1() { char a[] = { 'h','h','h' }; printf("char數組在函數中的地址%p\n", a); return a; }
將以上局部變量存放在堆中則能夠避免spa