內存分佈及程序運行中的BSS段、數據段、代碼段、堆和棧

  • 棧(stack):又稱堆棧,棧是由編譯器自動分配釋放,存放函數的參數值,局部變量的值等(但不包括static聲明的變量,static意味着在數據段中存放變量)。除此之外,在函數被調用時,棧用來傳遞參數和返回值。由於棧的先進後出的特點,所以棧特別方便用來保存/恢復調用數據。其操作方式類似於數據結構中的棧。
  • 堆(heap):堆是用於存放進程運行中被動態分配的內存段,它的大小,並不固定,可動態擴張或縮放。當進程調用malloc/free等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴張)/釋放的內存從堆中被提出(堆被縮減)。堆一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。
  • 全局數據區(靜態區)(static):全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和靜態變量在相鄰的另一塊區域。另外文字常量區,常量字符串就是放在這裏,程序結束後由系統釋放。
    (1) BSS段(bss segment):通常是指用來存放程序中未初始化的全局變量的一塊內存區域。BSS段屬於靜態內存分配。
    (2) 數據段(data segment):通常是指用來存放程序中已初始化的全局變量的一塊內存區域。數據段屬於靜態內存分配。
  • 代碼段(code segment/text segment):通常是指用來存放程序執行代碼的一塊內存區域。這部分區域的大小在程序運行之前就已經確定,並且內存區域通常屬於只讀,某些架構也允許代碼段爲可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的常數變量,例如字符串常量等。程序段爲程序代碼在內存中的映射,一個程序可以在內存中有多個副本。

#include <stdio.h>

int a = 0;                //全局初始化區 

char *p1;                //全局未初始化區 

int main(void)  
{ 
        int b;                 // 棧 

        char s[] = "abc";      //棧 

        char *p2;              //棧 

        char *p3 = "123456";    //123456\0在常量區,而p3在棧上。 

        static int c =0;       //全局(靜態)初始化區 

        p1 = (char *)malloc(10);

        p2 = (char *)malloc(20); //分配得來得10和20字節的區域就在堆區。 

        strcpy(p1, "123456");    //123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。

        return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章