之前寫了一篇堆棧的,這里再補充下內存其他的區域
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。
2、堆區(heap) — 一般由程序員分配釋放 , 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。
3、全局區(靜態區)(static)—,全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域(BSS)。 - 程序結束后由系統釋放
4、文字常量區 — 常量字符串就是放在這里的。 程序結束后由系統釋放
5、程序代碼區— 存放函數體的二進制代碼。
#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.可以看到棧空間也是同一段內存 連續分配的,按內存地址減小方向分配
4.可以看到堆空間也是同一段內存 連續分配的,按內存地址增大方向分配
5.文字常量區在自己特有的內存段內,且有機制控制字符常量不被修改(當字符串相同的時候,系統有時還會將兩個指針指向同一處)
注意 :在文字常量區的字符串不可以被修改,而在內存堆空間的字符串可以被修改!!

如此,代碼區又有特定的內存區。
