一:c語言程式的儲存區域
由c語言**(文字檔案)形成可執行程式(二進位制檔案),需要經過編譯-彙編-連線三個階段。編譯過程把c語言文字檔案生成匯程式設計序,彙編過程把匯程式設計序形成二進位制機器**,連線過程則將各個原始檔生成的二進位制機器**檔案組合成乙個檔案。
c語言編寫的程式經過編譯-連線後,將形成乙個統一檔案,它由幾個部分組成。在程式執行時又會產生其他幾個部分,各個部分代表了不同的儲存區域:
1.**段(code或text)
**段由程式中執行的機器**組成。在c語言中,程式語句進行編譯後,形成機器**。在執行程式的過程中,cpu的程式計數器指向**段的每一條機器**,並由處理器依次執行。
2.唯讀資料段(ro data)
唯讀資料段是程式使用的一些不會被更改的資料,使用這些資料的方式類似查表式的操作,由於這些變數不需要更改,因此只需要放置在唯讀儲存器中即可。
3.已初始化讀寫資料段(rw data)
已初始化資料是在程式中宣告,並且具有初值的變數,這些變數需要占用儲存器的空間,在程式執行時它們需要位於可讀寫的記憶體區域內,並具有初值,以供程式執行時讀寫。
4.未初始化資料段(bss)
未初始化資料是在程式中宣告,但是沒有初始化的變數,這些變數在程式執行之前不需要占用儲存器的空間。
5.堆(heap)
堆記憶體只在程式執行時出現,一般由程式設計師分配和釋放。在具有作業系統的情況下,如果程式沒有釋放,作業系統可能在程式(例如乙個程序)結束後**記憶體。
6.棧(stack)
棧記憶體只在程式執行時出現,在函式內部使用的變數、函式的引數以及返回值將使用棧空間,棧空間由編譯器自動分配和釋放。
看乙個例子:
int
a = 0;
//全域性初始化區。 data段
static
int
b=20;
//全域性初始化區。 data段
char
*p1;
//全域性未初始化區 bss段
const
int
a = 10;
// rodata段
void
main(
void
)
**段、唯讀資料段、讀寫資料段、未初始化資料段屬於靜態區域,而堆和棧屬於動態區域。**段、唯讀資料段和讀寫資料段將在鏈結之後產生,未初始化資料段將在程式初始化的時候開闢,而堆和棧將在程式的執行中分配和釋放。c語言程式分為映像和執行時兩種狀態。在編譯-連線後形成的映像中,將只包含**段(text)、唯讀資料段(ro data)和讀寫資料段(rw data)。在程式執行之前,將動態生成未初始化資料段(bss),在程式的執行時還將動態形成堆(heap)區域和棧(stack)區域。一般來說,在靜態的映像檔案中,各個部分稱之為節(section),而在執行時的各個部分稱之為段(segment)。如果不詳細區分,可以統稱為段。
在c語言的程式中,對變數的使用還有以下幾點需要注意:
1.函式體中定義的變數通常是在棧上,不需要在程式中進行管理,由編繹器處理。
2.用malloc,calloc,realloc等分配記憶體的函式所分配的記憶體空間在堆上,程式必須保證在使用free釋放,否則會發生記憶體洩漏。
3.所有函式體外定義的是全域性變數,加了static後的變數不管是在函式內部或外部都放在全域性區。
4.使用const定義的變數將放於程式的唯讀資料區。
棧空間主要用於以下3資料的儲存:
1.函式內部的動態變數
2.函式的引數
3.函式的返回值
棧空間是動態開闢與**的。在函式呼叫過程中,如果函式呼叫的層次比較多,所需要的棧空間也逐漸加大,對於引數的傳遞和返回值,如果使用較大的結構體,在使用的棧空間也會比較大。
C語言程式的儲存區域
c語言程式的儲存區域 c語言編寫的程式經過編繹 鏈結後,將形成乙個統一的檔案,它由幾個部分組成,在程式執行時又會產生幾個其他部分,各個部分代表了不同的儲存區域 段 code or text 段由程式中的機器碼組成。在c語言中,程式語句進行編譯後,形成機器 在執行程式的過程中,cpu的程式計數器指向 ...
C語言儲存區域的劃分
儲存區域的劃分 對於任何一塊記憶體其實都包括5個區域。記憶體位址從高到低依次是 1 棧區 棧記憶體的特點是有系統分配以及 記憶體。區域性變數都分配在棧區 2 堆區 有程式設計師申請分配和 記憶體的。3 靜態區 全域性區 定義在函式體外的變數後者由static關鍵字修飾的變數,程式執行過程中一直存在,...
c 儲存區域
來自 在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區 棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般...