- 棧(stack):又稱堆棧,棧是由編譯器自動(dòng)分配釋放珊肃,存放函數(shù)的參數(shù)值荣刑,局部變量的值等(但不包括static聲明的變量,static意味著在數(shù)據(jù)段中存放變量)伦乔。除此之外厉亏,在函數(shù)被調(diào)用時(shí),棧用來(lái)傳遞參數(shù)和返回值烈和。由于棧的先進(jìn)后出的特點(diǎn)爱只,所以棧特別方便用來(lái)保存/恢復(fù)調(diào)用數(shù)據(jù)。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧招刹。
- 堆(heap):堆是用于存放進(jìn)程運(yùn)行中被動(dòng)態(tài)分配的內(nèi)存段恬试,它的大小,并不固定疯暑,可動(dòng)態(tài)擴(kuò)張或縮放训柴。當(dāng)進(jìn)程調(diào)用malloc/free等函數(shù)分配內(nèi)存時(shí),新分配的內(nèi)存就被動(dòng)態(tài)添加到堆上(堆被擴(kuò)張)/釋放的內(nèi)存從堆中被提出(堆被縮減)妇拯。堆一般由程序員分配釋放幻馁,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收乖阵。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事宣赔,分配方式倒是類似于鏈表。
- 全局?jǐn)?shù)據(jù)區(qū)(靜態(tài)區(qū))(static):全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的瞪浸,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和靜態(tài)變量在相鄰的另一塊區(qū)域吏祸。另外文字常量區(qū)对蒲,常量字符串就是放在這里钩蚊,程序結(jié)束后由系統(tǒng)釋放。
(1) BSS段(bss segment):通常是指用來(lái)存放程序中未初始化的全局變量的一塊內(nèi)存區(qū)域蹈矮。BSS段屬于靜態(tài)內(nèi)存分配砰逻。
(2) 數(shù)據(jù)段(data segment):通常是指用來(lái)存放程序中已初始化的全局變量的一塊內(nèi)存區(qū)域。數(shù)據(jù)段屬于靜態(tài)內(nèi)存分配泛鸟。
- 代碼段(code segment/text segment):通常是指用來(lái)存放程序執(zhí)行代碼的一塊內(nèi)存區(qū)域蝠咆。這部分區(qū)域的大小在程序運(yùn)行之前就已經(jīng)確定,并且內(nèi)存區(qū)域通常屬于只讀北滥,某些架構(gòu)也允許代碼段為可寫(xiě)刚操,即允許修改程序。在代碼段中再芋,也有可能包含一些只讀的常數(shù)變量菊霜,例如字符串常量等。程序段為程序代碼在內(nèi)存中的映射济赎,一個(gè)程序可以在內(nèi)存中有多個(gè)副本鉴逞。
例如:
int a = 0; //全局初始化區(qū)
char *p1; //全局未初始化區(qū)
int 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); //分配得來(lái)得10和20字節(jié)的區(qū)域就在堆區(qū)。
strcpy(p1, "123456"); //123456\0放在常量區(qū)壳猜,編譯器可能會(huì)將它與p3所指向的"123456"優(yōu)化成一個(gè)地方叭喜。
return 0;
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者