天天看點

C/C++中 變量的存儲位置,BSS段 BSS段 可執行程式包括BSS段、資料段、代碼段(也稱文本段)。

内容轉自:http://www.docin.com/p-210019581.html 感謝分享。

1、首先,講下 “堆 heap” 和 “棧 stack” 的差別:

    一個由 c/c++編譯過的程式占用的記憶體分為一下幾個部分

    (1)、棧區 stack :由編譯器自動配置設定釋放,

              存放函數的參數值,局部變量的值等。

              這個棧的操作方式類似于資料結構中的棧。

    (2)、堆區 heap :一般由程式員配置設定釋放,若程式員不釋放,程式結束時可能由OS回收,

              注意它與資料結構中的堆是兩回事,配置設定方式類似于連結清單。

    (3)、全局區(靜态去)static : 全局變量和靜态變量的存儲是放在一塊的。

                    初始化的全局變量和靜态變量在一塊區域,

                    未初始化的全局變量和靜态變量又放在相鄰的另一塊區域中。

                    程式結束後由系統釋放。

    (4)、文字常量區  : 常量字元串放在這裡。

               程式結束後由系統釋放。

    (5)、程式代碼區 : 存放函數體的2進制代碼。

2、例子程式 

    這是一個前輩寫的,非常詳細 

   //main.cpp 

    int a = 0; 全局初始化區 

    char *p1; 全局未初始化區 

    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"優化成一個地方。 

    } 
           

BSS段

可執行程式包括BSS段、資料段、代碼段(也稱文本段)。

BSS(Block Started by Symbol)通常是指用來存放程式中未初始化的 全局變量和 靜态變量的一塊記憶體區域。特點是:可讀寫的,在程式執行之前BSS段會自動清0。是以,未初始的全局變量在程式執行之前已經成0了。 注意和 資料段的差別,BSS存放的是未初始化的 全局變量和 靜态變量,資料段存放的是初始化後的全局變量和靜态變量。 UNIX下可使用size指令檢視可執行檔案的段大小資訊。如size a.out。