C程式的記憶體佈局


C程式的記憶體佈局如下所示。它包含幾個層級,分別是:

  • 棧段
  • 堆段
  • 程式碼段
  • 資料段

現在讓我們看看這些段的功能。

序號段 & 描述
1
程序棧包含臨時資料,例如方法/函式引數、返回地址和區域性變數。它是為自動變數和函式引數分配的記憶體區域。它還在執行函式呼叫時儲存返回地址。棧使用 LIFO(後進先出)機制來儲存區域性變數或自動變數、函式引數以及儲存下一個地址或返回地址。返回地址指的是函式執行完成後返回的地址。此段的大小根據區域性變數、函式引數和函式呼叫而變化。此段從高地址向低地址增長。
2
這是在程序執行時動態分配給程序的記憶體。它是為動態記憶體儲存分配的記憶體區域,例如 malloc() 和 calloc() 呼叫。此段的大小也根據使用者分配而變化。此段從低地址向高地址增長。
現在讓我們檢查一下段(資料和 bss 段)的大小在一些示例程式中是如何變化的。可以使用“size”命令獲取段的大小。
3程式碼段
這包括由程式計數器的值表示的當前活動以及處理器的暫存器內容。它由 .text 部分表示。它定義了一個儲存指令程式碼的記憶體區域。這也是一個固定區域。
4資料段
此段包含全域性變數和靜態變數。它由 .data 段和 .bss 表示。.data 段用於宣告記憶體區域,程式的資料元素儲存在此區域中。此段在宣告資料元素後無法擴充套件,並且在整個程式中保持靜態。
.bss 段也是一個靜態記憶體段,包含稍後在程式中宣告的資料的緩衝區。此緩衝區記憶體被清零。

資料段可以進一步細分為兩個部分。

序號段 & 描述
1已初始化資料段
這是目標檔案或程式虛擬地址空間的一部分,包含未初始化的靜態和全域性變數。未初始化資料段也稱為 BSS(以符號開頭塊)段。
2未初始化資料段
這是可讀寫的,因為變數的值可以在執行時更改。此段也具有固定大小。

更新於: 2019年7月30日

2K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告