一個由C/C++編譯的程序占用的內存分為以下幾個部分
1、棧區(qū)(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其
操作方式類似于數據結構中的棧。
2、堆區(qū)(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回
收(?這個可能針對Java那樣的有回收機制的語言而說的,對于c/c++,這樣的必須要手動釋放開辟的堆內存) 。注意它與數據結構中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。
3、全局區(qū)(靜態(tài)區(qū))(static)—,全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的
全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另
一塊區(qū)域。 - 程序結束后由系統(tǒng)釋放。
4、文字常量區(qū) —常量字符串就是放在這里的。 程序結束后由系統(tǒng)釋放
5、程序代碼區(qū)—存放函數體的二進制代碼。
二、例子程序
這是一個前輩寫的,非常詳細
//main.cpp
int a = 0; 全局初始化區(qū)
char *p1; 全局未初始化區(qū)
main()
{
int b; 棧
char s[] = "abc"; abc應該放在常量區(qū)吧,占四個字節(jié)“abc\n”,s在棧上,占四個字節(jié)
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ū),編譯器可能會將它與p3所指向的"123456" 優(yōu)化成一個地方。
}