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

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

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

int main()  { 
        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;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容