C++基礎--指針---返回指針時棧被移除的坑

1.函數局部變量地址釋放的坑

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

相關文章
相關標籤/搜索