image.png
- 棧區(qū)(stack):由系統(tǒng)自動分配舶沛,一般存放函數參數值、局部變量的值等窗价。由編譯器自動創(chuàng)建與釋放如庭。其操作方式類似于數據結構中的棧,即后進先出撼港、先進后出的原則坪它。
/// 在函數中申明一個局部變量;系統(tǒng)自動在棧中為b開辟空間。
int b
- 堆區(qū)(heap):一般由程序員申請并指明大小帝牡,最終也由程序員釋放往毡。如果程序員不釋放,程序結束時可能會由OS回收靶溜。對于堆區(qū)的管理是采用鏈表式管理的开瞭,操作系統(tǒng)有一個記錄空閑內存地址的鏈表,當接收到程序分配內存的申請時,操作系統(tǒng)就會遍歷該鏈表惩阶,遍歷到一個記錄的內存地址大于申請內存的鏈表節(jié)點,并將該節(jié)點從該鏈表中刪除扣汪,然后將該節(jié)點記錄的內存地址分配給程序断楷。
/// C中malloc函數,但是p1本身是在棧中的。
char p1;
p1 = (char )malloc(10);
- 全局區(qū)/靜態(tài)區(qū):顧名思義崭别,全局變量和靜態(tài)變量存儲在這個區(qū)域冬筒。只不過初始化的全局變量和靜態(tài)變量存儲在一塊,未初始化的全局變量和靜態(tài)變量存儲在一塊茅主。程序結束后由系統(tǒng)釋放舞痰。
- 文字常量區(qū):這個區(qū)域主要存儲字符串常量。程序結束后由系統(tǒng)釋放诀姚。
- 程序代碼區(qū):這個區(qū)域主要存放函數體的二進制代碼响牛。
//main.cpp
int a = 0; // 全局初始化區(qū)
char *p1; // 全局未初始化區(qū)
main {
int b; // 棧
char s[] = "abc"; // 棧
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ū)呀打,這個函數的作用是將"123456" 這串字符串復制一份放在p1申請的10個字節(jié)的堆區(qū)域中。
// p3指向的"123456"與這里的"123456"可能會被編譯器優(yōu)化成一個地址糯笙。
}