C++中內存的分配問題


 

最近看到遞歸問題,很多遞歸都和堆棧有關,於是就看了下關於C++內存分配的知識

在C++中,內存分成5個區,他們分別是堆、棧、代碼區、全局/靜態存儲區和常量存儲區

 

圖中將代碼區和常量存儲區歸併到只讀代碼了

 

     棧:編譯器自動分配釋放,一般存放函數參數值,局部變量

     堆:是唯一由程序員管理的內存區域,如C中的malloc ,free, C++中的 new,delete

     代碼區:存放函數體(類成員函數和全局函數)的二進制代碼

     全局/靜態存儲區:如在函數中用static聲明的,或者在程序開頭聲明的,在編譯時就開闢好內存

     常量存儲區:如char *p="Hello World";  (雖然由系統管理,但是作用域是貫穿於整個程序的,這點比較重要)

 

     程序分析:

#include<iostream>
using namespace std;
char* fun()
{
	char str[]="hello world!";
	return str;
}
int main(void)
{
	char *pStr;
	pStr=fun();
	cout<<pStr<<endl;
	return 0;
}

  程序結果:

  原因:出現亂碼-----str中的內容是保存在棧中的,當fun結束,系統自然就收回在棧中的內存了

 

#include<iostream>
using namespace std;
char* fun()
{
	char *str="hello world!";
	return str;
}
int main(void)
{
	char *pStr;
	pStr=fun();
	cout<<pStr<<endl;
	return 0;
}


 

程序結果:

原因:怎麼會出現Hello World呢疑問

        由於Hello World不能通過*str改變的,所以爲文字常量,是存儲在常量存儲區的,而他的作用域是貫穿於整個程序的

 

 

從這裏我們看出數組和指針是不相等的str[]、*str,可在網上甚至在課堂上經常出現

數組=指針

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章