不同的compiler在編譯的過程中對於儲存的分配可能略有不同,但基本結構大致相同。
大體上可分為三段:text段、data段和bss段。
text段用於存放**,通常情況下在記憶體中被對映為唯讀,但data和bss是可寫的。
資料存放通常分成如下幾個部分:
1、棧:由編譯器自動分配,儲存函式的區域性變數和引數。
2、堆:一般由程式設計師動態分配釋放, 若程式設計師不釋放,程式結束時可能由os** ,例如malloc。它不同與資料結構中的堆,它更類似於鍊錶。
3、全域性區:全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域。
4、文字常量區:這一區域很多情況下在**區,因為**段和常量一樣是唯讀的。
5、程式**區:存放函式體的二進位制**。
6、bss段:定義而沒有賦初值的全域性變數和靜態變數,放在這個區域,通常只是記錄變數名和大小,相當於乙個佔位符。
1 #include2 #include3 #include4 #includeview code5using
namespace
std;67
static
int a=1;//
全域性初始化區
8int b=2;//
全域性初始化區
9char *p;//
全域性未初始化區
10char *p2;//
全域性未初始化區,bss段
11int *p3;//
全域性未初始化區 ,bss段
12int *p4;//
全域性未初始化區 ,bss段
13char *p5=;//
全域性初始化區
1415
intmain();
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
2728 *p3=0x123
;29 strcpy(p,"
123456789
");//
文字常量區
30 strcpy(p2,"
987654321");
31 strcpy(p2,"
123456789");
32 }
text段,data段,bss段,堆和棧
乙個程式一般分為3段 text段,data段,bss段 text段 就是放程式 的,編譯時確定,唯讀,data段 存放在編譯階段 而非執行時 就能確定的資料,可讀可寫 就是通常所說的靜態儲存區,賦了初值的全域性變數和靜態變數存放在這個區域,常量也存放在這個區域 bss段 定義而沒有賦初值的全域性變數...
text段,data段,bss段,堆和棧
乙個程式一般分為3段 text段,data段,bss段 text段 就是放程式 的,編譯時確定,唯讀,data段 存放在編譯階段 而非執行時 就能確定的資料,可讀可寫 就是通常所說的靜態儲存區,賦了初值的全域性變數和靜態變數存放在這個區域,常量也存放在這個區域 bss段 定義而沒有賦初值的全域性變數...
text段 data段和bss段知識介紹
一 總體概述 1 bss 可讀可寫 bss是英文block started by symbol的簡稱,通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域,在程式載入時由核心清0。bss段屬於靜態記憶體分配。它的初始值也是由使用者自己定義的連線定位檔案所確定,使用者應該將它定義在可讀寫的ram...