天天看點

變量的存儲空間配置設定情況

C程式一直由下列部分組成:

(1)正文段——CPU執行的機器指令部分;一個程式隻有一個副本;隻讀,防止程式由于意外事故而修改自身指令;

(2)初始化資料段(資料段)——在程式中所有賦了初值的全局變量,存放在這裡。

(3)非初始化資料段(bss段)——在程式中沒有初始化的全局變量;核心将此段初始化為0。

(4)棧——增長方向:自頂向下增長;自動變量以及每次函數調用時所需要儲存的資訊(傳回位址;環境資訊)。

(5)堆——動态存儲配置設定。

一般認為在c中分為這幾個存儲區

(1)、棧 - 有編譯器自動配置設定釋放

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

(3)、全局區(靜态區),全局變量和靜态變量的存儲是放在一塊的,初始化的全局變量和靜

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

- 程式結束釋放

(4)、另外還有一個專門放常量的地方。 - 程式結束釋放

在函數體中定義的變量通常是在棧上,用malloc, calloc, realloc等配置設定記憶體的函數分

配得到的就是在堆上。在所有函數體外定義的是全局量,加了static修飾符後不管在哪

裡都存放在全局區(靜态區),在所有函數體外定義的static變量表示在該檔案中有效,

不能extern到别的檔案用,在函數體内定義的static表示隻在該函數體内有效。另外,

函數中的"adgfdf"這樣的字元串存放在常量區。

比如:

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所指向的"12345

6"優化成一塊。

}

繼續閱讀