C語言是一門通用計算機程式語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低階儲存器、產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。下面我們一起來看看C語言程式的記憶體如何佈局,歡迎大家閱讀!
C語言程式的記憶體如何佈局一:C語言程式的儲存區域
由C語言程式碼(文字檔案)形成可執行程式(二進位制檔案),需要經過編譯-彙編-連線三個階段。編譯過程把C語言文字檔案生成彙編程式,彙編過程把彙編程式形成二進位制機器程式碼,連線過程則將各個原始檔生成的二進位制機器程式碼檔案組合成一個檔案。
C語言編寫的程式經過編譯-連線後,將形成一個統一檔案,它由幾個部分組成。在程式執行時又會產生其他幾個部分,各個部分代表了不同的儲存區域:
1.程式碼段(Code或Text)
程式碼段由程式中執行的機器程式碼組成。在C語言中,程式語句進行編譯後,形成機器程式碼。在執行程式的過程中,CPU的程式計數器指向程式碼段的每一條機器程式碼,並由處理器依次執行。
2.只讀資料段(RO data)
只讀資料段是程式使用的一些不會被更改的資料,使用這些資料的方式類似查表式的操作,由於這些變數不需要更改,因此只需要放置在只讀儲存器中即可。
3.已初始化讀寫資料段(RW data)
已初始化資料是在程式中宣告,並且具有初值的變數,這些變數需要佔用儲存器的空間,在程式執行時它們需要位於可讀寫的記憶體區域內,並具有初值,以供程式執行時讀寫。
4.未初始化資料段(BSS)
未初始化資料是在程式中宣告,但是沒有初始化的變數,這些變數在程式執行之前不需要佔用儲存器的空間。
5.堆(heap)
堆記憶體只在程式執行時出現,一般由程式設計師分配和釋放。在具有作業系統的情況下,如果程式沒有釋放,作業系統可能在程式(例如一個程序)結束後回收記憶體。
6.棧(stack)
棧記憶體只在程式執行時出現,在函式內部使用的變數、函式的引數以及返回值將使用棧空間,棧空間由編譯器自動分配和釋放。
C語言目標檔案的`記憶體佈局
看一個例子:
int a = 0; //全域性初始化區,。data段
static int b=20; //全域性初始化區,。data段
char *p1; //全域性未初始化區 段
const int A = 10; //ta段
void main(void)
{
int b; //棧
char s[] = "abc"; //棧
char *p2; //棧
static int c = 0; //全域性(靜態)初始化區 段
char *p3 = "123456"; //123456