不同的compiler在編譯的過程中對於存儲的分配可能略有不同,但基本結構大致相同。
大體上可分為三段:Text段、Data段和BSS段。
text段用於存放代碼,通常情況下在內存中被映射為只讀,但data和bss是可寫的。
數據存放通常分成如下幾個部分:
1、棧:由編譯器自動分配,保存函數的局部變量和參數。
2、堆:一般由程序員動態分配釋放, 若程序員不釋放,程序結束時可能由OS回收 ,例如malloc。它不同與數據結構中的堆,它更類似於鏈表。
3、全局區:全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域。
4、文字常量區:這一區域很多情況下在代碼區,因為代碼段和常量一樣是只讀的。
5、程序代碼區:存放函數體的二進制代碼。
6、bss段:定義而沒有賦初值的全局變量和靜態變量,放在這個區域,通常只是記錄變量名和大小,相當於一個占位符。
參考別人的一段示例代碼:

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<iostream> 4 #include<string.h> 5 using namespace std; 6 7 static int a=1;//全局初始化區 8 int b=2;//全局初始化區 9 char *p;//全局未初始化區 10 char *p2;//全局未初始化區,BSS段 11 int *p3;//全局未初始化區 ,BSS段 12 int *p4;//全局未初始化區 ,BSS段 13 char *p5={"555555555"};//全局初始化區 14 15 int main(){ 16 static int c=3; 17 int d=4;//內存棧 18 int e=7;//內存棧 19 20 char *p6={"555555555"}; 21 p=(char*)malloc(sizeof(char)*10);//內存堆 22 p2=(char*)malloc(sizeof(char)*10);//內存堆 23 p3=(int*)malloc(sizeof(int));//內存堆 24 p4=(int*)malloc(sizeof(int)*10);//內存堆 25 for(int i=0;i<=9;i++)p4[i]=0x1; 26 27 28 *p3=0x123; 29 strcpy(p,"123456789");//文字常量區 30 strcpy(p2,"987654321"); 31 strcpy(p2,"123456789"); 32 }