以前寫了一篇堆棧的,這裏再補充下內存其餘的區域ios
一、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操做方式相似於數據結構中的棧。
二、堆區(heap) — 通常由程序員分配釋放 , 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式卻是相似於鏈表。
三、全局區(靜態區)(static)—,全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域(BSS)。 - 程序結束後由系統釋放
四、文字常量區 — 常量字符串就是放在這裏的。 程序結束後由系統釋放
五、程序代碼區— 存放函數體的二進制代碼。程序員
#include<stdio.h> #include<stdlib.h> #include<iostream> #include<string.h> using namespace std; static int a=1;//全局初始化區 int b=2;//全局初始化區 char *p;//全局未初始化區 char *p2;//全局未初始化區 int *p3;//全局未初始化區 int *p4;//全局未初始化區 char *p5={"555555555"};//全局初始化區 int main(){ static int c=3; int d=4;//內存棧 int e=7;//內存棧 char *p6={"555555555"}; p=(char*)malloc(sizeof(char)*10);//內存堆 p2=(char*)malloc(sizeof(char)*10);//內存堆 p3=(int*)malloc(sizeof(int));//內存堆 p4=(int*)malloc(sizeof(int)*10);//內存堆 for(int i=0;i<=9;i++)p4[i]=0x1; *p3=0x123; strcpy(p,"123456789");//文字常量區 strcpy(p2,"987654321"); strcpy(p2,"123456789"); }
1.能夠看到全局初始化區與全局(靜態)初始化區是在同一段內存 連續分配的,按內存地址增加方向分配數據結構
2.全局初始化區與全局未初始化區不在同一段內存區,全局初始化區好像按內存地址增加方向分配,全局未初始化區好像按內存增加的方向貌似沒有規律!!函數
3.能夠看到棧空間也是同一段內存 連續分配的,按內存地址減少方向分配spa
4.能夠看到堆空間也是同一段內存 連續分配的,按內存地址增大方向分配指針
5.文字常量區在本身特有的內存段內,且有機制控制字符常量不被修改(當字符串相同的時候,系統有時還會將兩個指針指向同一處)code
注意 :在文字常量區的字符串不能夠被修改,而在內存堆空間的字符串能夠被修改!!blog
如此,代碼區又有特定的內存區。內存