1. 程式人生 > >C程序的存儲空間布局

C程序的存儲空間布局

即使 編譯 long .cn 操作 文本 src block 編輯

歷史沿襲至今,C程序一直由下列幾部分組成:

技術分享

1. 正文段。這是由CPU執行的機器指令部分。通常,正文段是可共享的,所以即使是頻繁執行的程序(如文本編輯器、C編譯器和shell等)在存儲器中也只需有一個副本,另外,正文段常常是只讀的,心防止程序由於意外而修改其指令。

2. 初始化數據段。通常將此段稱為數據段,它包含了程序中需明確地賦初值的變量。例如,C程序中任何函數之外的聲明:

int maxcount = 99;

使此變量以其初值存放在初始化數據段中。

3. 未初始化數據段。通常將此段稱為bss段,這一名稱來源於時期匯編程序的一個操作符,意思是“由符號開始的塊“(block started by symbol),在程序開始執行之前,內核將此段中的數據初始化為0或空指針。函數外的聲明:

long sum[1000];

使此變量存放在非初始化數據段中。

4. 棧。自動變量以及每次函數調用時所需保存的信息都存放在此段中。每次函數調用時,其返回地址以及調用者的環境信息(如某些機器寄存器的值)都存放在棧中。然後,最近被調用的函數在棧上為其自動和臨時變量分配存儲空間。通過心這種方式使用棧,C遞歸函數可以工作。遞歸函數每次調用自身時,就用一個新的棧幀,因此一次函數調用實例中的變量集不會影響另一次函數調用實例中的變量。

5. 堆。通常在堆中進行動態存儲分配。由於歷史上形成的慣例,堆位於未初始化數據段和棧之間。

C程序的存儲空間布局