C程式的記憶體布局

2021-09-27 13:32:43 字數 1115 閱讀 8005

乙個c程式一直以來都是由以下5個段(pieces)組成:

正文段。

這是由cpu執行的機器指令部分。通常,正文段是可共享的,所以即使執行的程式(如文字編輯程式、c編譯程式、shell等)在儲存器中也只需有乙個副本(否則會造成資源浪費,試想如果開同樣的程式100個,每個正文段都要乙個相同副本),另外,正文段常常是唯讀的,以防止程式由於意外事故而修改其自身的指令。

初始化資料段(data段)

通常將此段稱為資料段,它包含了程式中需賦初值的變數。例如, c程式中任何函式之外的說明:int maxcount = 99;使此變數以初值存放在初始化資料段中。同時data段存初始化的全域性變數和static變數,另外還有文字常量區,常量字串就是放在這裡,程式結束後有系統釋放。

非初始化資料段(bss段)

通常將此段稱為bss段,這一名稱**於早期匯程式設計序的乙個操作符,意思是「block started by symbol(由符號開始的塊)」,在程式開始執行之前,核心將此段初始化為0 這也應該是區分data段和bbs段的原因,data段中的變數值都是從檔案中讀入的,bbs段區域在系統執行時已經全部初始化為0。函式外的說明:long sum[1000] ;使此變數存放在非初始化資料段中。存未初始化的全域性變數和static變數。

自動變數以及每次函式呼叫時所需儲存的資訊都存放在此段中。每次函式呼叫時,其返回位址、以及呼叫者的環境資訊(例如某些機器暫存器)都存放在棧中。然後,新被呼叫的函式在棧上為其自動和臨時變數分配儲存空間。通過以這種方式使用棧, c函式可以遞迴呼叫。

通常在堆中進行動態儲存分配。由於歷史上形成的慣例,堆位於非初始化資料段(bss)頂和棧底之間。

在unix終端中可以用size $filename進行檢視。

命令size會報告這3個段的大小:**段(text),初始化資料段(data),未初始化資料段(bss)。

dec和hex是計算這3個段的總計大小,分別以十進位制和十六進製制表示出來。

c 程式的記憶體布局

對任何乙個普通c 程式來講,它都會涉及到 5種不同的資料段。常用的幾個資料段種包含有 程式 段 程式資料段 程式堆疊段 等。不錯,這幾種資料段都在其中,但除了以上幾種資料段之外,程序還另外包含兩種資料段。下面我們來簡單歸納一下程序對應的記憶體空間中所包含的 5種不同的資料區。段 段是用來存放可執行檔...

C程式的記憶體布局

c程式的記憶體布局 c程式的典型記憶體表示由以下部分組成 1.文字段 cpu 執行的機器指令 2.初始化資料段 資料段 3.未初始化的資料段 也稱bss段 4.棧 自動變數以及每次函式呼叫時所需儲存的的資訊都放在棧中 5.堆 通常在堆中進行動態儲存分配 如下圖所示 測試 include includ...

C 程式的記憶體布局

乙個c c 源程式經過編譯之後,其應用程式使用的記憶體可劃分為一下幾個部分 1 區 區存放函式體的二進位制 可執行檔案載入之後,就存放在程序的 區。這部分分區域是唯讀的,如果試圖修改,將導致執行時錯誤。一般來說,程式的 區存放的是程式的可執行 在某些特殊情況下,一些重要的資料也可以放入 區,以防止錯...