c程式儲存空間布局

2021-06-04 00:07:44 字數 1367 閱讀 1734

摘自:

c程式一直由下面幾部分組成:

(1) 棧

由編譯器自動分配釋放管理。區域性變數及每次函式呼叫時返回位址、 以及呼叫者的環境資訊(例如某些機器暫存器)都存放在棧中。新被呼叫的函式在棧上為其自動和臨時變數分配儲存空間。通過以這種方式使用棧,c函式可以遞迴 呼叫。遞迴函式每次呼叫自身時,就使用乙個新的棧幀,因此乙個函式呼叫例項中的變數集不會影響另乙個函式呼叫例項中的變數。

a.區域性變數

b.函式呼叫時返回位址

c.呼叫者的環境資訊(例如某些機器暫存器)

(2) 堆

需要由程式設計師分配釋放管理,若程式設計師不釋放,程式結束時可能由os**。通常在堆中進行動態儲存分配。

如程式中的malloc,calloc, realloc等函式都從這裡面分配。堆是從下向上分配的。

(3) 非初始化資料段

通 常將此段稱為bss段,這一名稱**於早期匯程式設計序的乙個操作符,意思是「block started by symbol(由符號開始的塊)」,未初始化的全域性變數和靜態變數存放在這裡。在程式開始執行之前,核心將此段初始化為0。函式外的說明:longsum[1000] ; 使此變數存放在非初始化資料段中。在bss資料或者stack(棧)的增長耗盡了系統分配給程序的自由記憶體的情況下, 程序將會被阻塞, 重新被作業系統用更大的記憶體模組來排程執行. 非初始化資料(bss)區用於存放程式的靜態變數, 這部分記憶體都是被初始化為零的.

初始化資料區用於存放可執行檔案裡的初始化資料.

這兩個區統稱為資料區

a.未初始化的全域性變數

b.未初始化的靜態變數

靜態變數又分為靜態區域性變數和靜態全域性變數

(4) 初始化的資料

通常將此段稱為資料段,它包含了程式中需賦初值的變數。初始化的全域性變數和靜態變數存放在這裡。例如,c程式中任何函式之外的說明:intmaxcount = 99; 使此變數以初值存放在初始化資料段中。

a.初始化的全域性變數

b.初始化的靜態變數

靜態變數又分為靜態區域性變數和靜態全域性變數

3和4部分統稱為靜態區

(5) 正文段

cpu執行的機器指令部分。通常,正文段是可共享的,所以即使是經常環境指標環境表環境字串執行的程式(如文字編輯程式、c編譯程式、s h e l l等)在儲存器中也只需有乙個副本,另外,正文段常常是唯讀的,以防止程式由於意外事故而修改其自身的指令。

可以注意到未初始化的資料段的內容並不放在磁碟上的程式檔案中,因為,在程式開始執行前他們都被設定為0。需要存放在程式檔案中的只有正文段和初始化資料段。

這段內容和第一階段課本上p143的記憶體對映不同,課本上是說.data和.bss段也是loaded from the executable file

注:size命令報告正文段、資料段、和bss段的長度(單位:位元組)

c程式儲存空間布局

摘自 c程式一直由下面幾部分組成 1 棧 由編譯器自動分配釋放管理。區域性變數及每次函式呼叫時返回位址 以及呼叫者的環境資訊 例如某些機器暫存器 都存放在棧中。新被呼叫的函式在棧上為其自動和臨時變數分配儲存空間。通過以這種方式使用棧,c函式可以遞迴 呼叫。遞迴函式每次呼叫自身時,就使用乙個新的棧幀,...

C程式的儲存空間布局

下午突然想到了c程式的儲存空間布局,忘了,翻書溫習,記錄如下 乙個c程式的組成 正文段,初始化資料段 資料段 非初始化資料段 bss 棧,堆 下面簡單介紹下這些段 正文段 由cpu執行的機器指令部分。通常,正文段是可共享的,在儲存器中只需要有乙個副本即可,很多時候,正文段也是唯讀的,防止意外修改 初...

C程式的儲存空間布局

c程式一直由下面幾部分組成 正文段 這是由cpu執行的機器指令部分。通常,正文段是可共享的,所以即使是頻繁執行的程式在儲存器中也只需乙個副本,另外,正文段常常是唯讀的,以防止程式由於意外而修改其自身的指令。初始化資料段 通常將此段稱為資料段,它包含了程式中需要明確地賦初值的變數。非初始化資料段 通常...