C程式的記憶體佈局
C程式的記憶體佈局如下所示。它包含幾個層級,分別是:
- 棧段
- 堆段
- 程式碼段
- 資料段
現在讓我們看看這些段的功能。
序號 | 段 & 描述 |
---|---|
1 | 棧 程序棧包含臨時資料,例如方法/函式引數、返回地址和區域性變數。它是為自動變數和函式引數分配的記憶體區域。它還在執行函式呼叫時儲存返回地址。棧使用 LIFO(後進先出)機制來儲存區域性變數或自動變數、函式引數以及儲存下一個地址或返回地址。返回地址指的是函式執行完成後返回的地址。此段的大小根據區域性變數、函式引數和函式呼叫而變化。此段從高地址向低地址增長。 |
2 | 堆 這是在程序執行時動態分配給程序的記憶體。它是為動態記憶體儲存分配的記憶體區域,例如 malloc() 和 calloc() 呼叫。此段的大小也根據使用者分配而變化。此段從低地址向高地址增長。 現在讓我們檢查一下段(資料和 bss 段)的大小在一些示例程式中是如何變化的。可以使用“size”命令獲取段的大小。 |
3 | 程式碼段 這包括由程式計數器的值表示的當前活動以及處理器的暫存器內容。它由 .text 部分表示。它定義了一個儲存指令程式碼的記憶體區域。這也是一個固定區域。 |
4 | 資料段 此段包含全域性變數和靜態變數。它由 .data 段和 .bss 表示。.data 段用於宣告記憶體區域,程式的資料元素儲存在此區域中。此段在宣告資料元素後無法擴充套件,並且在整個程式中保持靜態。 .bss 段也是一個靜態記憶體段,包含稍後在程式中宣告的資料的緩衝區。此緩衝區記憶體被清零。 |
資料段可以進一步細分為兩個部分。
序號 | 段 & 描述 |
---|---|
1 | 已初始化資料段 這是目標檔案或程式虛擬地址空間的一部分,包含未初始化的靜態和全域性變數。未初始化資料段也稱為 BSS(以符號開頭塊)段。 |
2 | 未初始化資料段 這是可讀寫的,因為變數的值可以在執行時更改。此段也具有固定大小。 |
廣告