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"優化成一塊。
}