.1個(gè)由C/C++編譯的程序占用的內(nèi)存分為以下幾個(gè)部分
1>棧區(qū)(stack)——由編譯器自動(dòng)分配釋放 ,存放函數(shù)的參數(shù)值韧衣,局部變量的值等盅藻。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧购桑。
2>堆區(qū)(heap)——一般由程序員分配釋放, 若程序員不釋放氏淑,程序結(jié)束時(shí)可能由OS回收 勃蜘。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表假残,呵呵缭贡。
3>全局區(qū)(靜態(tài)區(qū))(static)——全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域辉懒,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域匀归。程序結(jié)束后由系統(tǒng)釋放
4>文字常量區(qū)——常量字符串就是放在這里的(不可修改)。 程序結(jié)束后由系統(tǒng)釋放
5>程序代碼區(qū)——存放函數(shù)體的二進(jìn)制代碼耗帕。
?例子程序
這是一個(gè)前輩寫的穆端,非常詳細(xì)
//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ū)嗽仪,編譯器可能會(huì)將它與p3所指向的"123456"優(yōu)化成一個(gè)地方荒勇。
}