轉自:https://www.cnblogs.com/fanhaha/p/7117766.html
原因:傳回值是拷貝值,局部變量的作用域為函數内部,函數執行結束,棧上的局部變量會銷毀,記憶體釋放。
可傳回的局部變量:
1. 傳回局部變量本身
1 int sum(int a, int b)2 {3 int s=a+b;4 return s;5 }
2.常量:
1 char* returnValue() 2 { 3 char* str="HelloJacky"; 4 return str; 5 }
char * str=“hello world”字元串常量,不能str[1]='a'. 常量不能修改。 這種文法是為了相容c代碼。“hello world” 是const char * 類型。然後将char * 指向存儲的位置。使用C++編譯器會有警告提示:
warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]|
推薦把類型修改為const char *
也就是說,這種文法的存在,隻是為了保證以前的C代碼可以正常編譯。
1 //錯誤2 char* returnValue() 3 { 4 char str[]="HelloJacky"; 5 return str; 6 }
str 為局部變量
3. 靜态局部變量
當多次調用一個函數且要求在調用之間保留某些變量的值時,可考慮采用靜态局部變量。雖然用全局變量也可以達到上述目的,但全局變量有時會造成意外的副作用,是以仍以采用局部靜态變量為宜。
1 //正确2 char* returnValue() 3 { 4 static char str[]="HelloJacky"; 5 return str; 6 }
強制定義為靜态類型;
1 int* returnValue() 2 { 3 static int value[3]={1,2,3}; 4 return value; 5 }
數組名是不就變量的首位址,加上static 可以
4. 堆記憶體中的局部變量
1 //正确2 int *sum(int a, int b)3 {4 int *s=new int();5 *s=a+b;6 return s;7 }
1 char* newMemory(int size) 2 { 3 char* p=NULL; 4 p=new char[size]; 5 return p; 6 } 7 8 int _tmain(int argc, _TCHAR* argv[]) 9 { 10 char* p=newMemory(2); 11 if(p!=NULL) 12 { 13 *p='a'; 14 } 15 std::cout<
在函數内new空間,在函數外delete空間。函數内申請空間,調用後釋放空間。但這不是一種好的程式設計習慣,盡量在同一作用域内進行new和 delete操作。接口不靈活
五大記憶體分區(貌似與編譯原理中不一樣,不過道理是一樣的,實際存在的東西總是會與理論有一定差距的)
1.在C++中,記憶體分成5個區,他們分别是堆、棧、自由存儲區、全局/靜态存儲區和常量存儲區。
2.棧,就是那些由編譯器在需要的時候配置設定,在不需要的時候自動清楚的變量的存儲區。裡面的變量通常是局部變量、函數參數等。
3.堆,就是那些由new配置設定的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般一個new就要對應一個delete。如果程式員沒有釋放掉,那麼在程式結束後,作業系統會自動回收。
4.自由存儲區,就是那些由malloc等配置設定的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。
5.全局/靜态存儲區,全局變量和靜态變量被配置設定到同一塊記憶體中,在以前的C語言中,全局變量又分為初始化的和未初始化的,在C++裡面沒有這個區分了,他們共同占用同一塊記憶體區。
6.常量存儲區,這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多)
c語言局部變量存在什麼區_C++函數傳回局部變量