程序的內存分配

一個由C/C++編譯的程序占用的內存分為以下幾個部分
1、棧區(qū)(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其
操作方式類似于數據結構中的棧。
2、堆區(qū)(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回
收(?這個可能針對Java那樣的有回收機制的語言而說的,對于c/c++,這樣的必須要手動釋放開辟的堆內存) 。注意它與數據結構中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。
3、全局區(qū)(靜態(tài)區(qū))(static)—,全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的
全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另
一塊區(qū)域。 - 程序結束后由系統(tǒng)釋放。
4、文字常量區(qū) —常量字符串就是放在這里的。 程序結束后由系統(tǒng)釋放
5、程序代碼區(qū)—存放函數體的二進制代碼。

二、例子程序
這是一個前輩寫的,非常詳細

 //main.cpp    
 int a = 0;   全局初始化區(qū)    
 char *p1;   全局未初始化區(qū)    
 main()    
 {    
   int b;   棧    
   char s[] = "abc";   abc應該放在常量區(qū)吧,占四個字節(jié)“abc\n”,s在棧上,占四個字節(jié)    
   char *p2;  棧    
   char  *p3  =  "123456";   123456/0在常量區(qū),p3在棧上。    
   static  int  c  = 0;   全局(靜態(tài))初始化區(qū)    
   p1 = (char *)malloc(10);    
   p2 = (char *)malloc(20);    分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。    
   strcpy(p1,   "123456");   123456/0放在常量區(qū),編譯器可能會將它與p3所指向的"123456" 優(yōu)化成一個地方。    
 }    

參考

https://blog.csdn.net/hairetz/article/details/4141043

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容