引言:
一個寫好的程式一般要存放在存儲器中,那麼程式中的代碼、資料等各部分,是如何有規律的存放在存儲器中的呢?
(一)
一個存儲的程式可分為五部分:正文段、初始化資料段、非初始化資料段、棧、堆。其典型的存儲安排如下圖:

正文段:這是由CPU執行的機器指令的部分。通常,正文段是可共享的,是以即使是頻繁執行的程式在存儲器中也隻需要一個副本,另外正文段常常是隻讀的,以防止程式由于意外而修改其自身的指令。
初始化資料段:通常稱為資料段,它包含了程式中需要明确地賦初值的變量。
非初始化資料段:通常稱為bss段。在程式開始執行之前,核心将此段中的資料初始化為0或空指針。
棧:自動變量以及每次函數調用時所需儲存的資訊都存放在此段中。每次調用函數是,其傳回位址以及調用者的環境資訊都存放在棧中。然後,最近被調用的函數在棧上為其自動和臨時變量配置設定存儲空間。
堆:通常在堆中進行動态存儲配置設定。
Linux中使用size指令可以檢視檔案的正文段、資料段和bss段的長度。
(二)
存儲器配置設定:一般用于存儲空間動态配置設定的函數有malloc/calloc/realloc。
1、malloc:配置設定指定位元組數的存儲區。此存儲區中的初始化值不确定。
2、calloc:為指定數量的對象配置設定存儲空間。該空間中的每一位都初始化為0。
3、realloc:更改以前配置設定區的長度(增加或減少)。
動态記憶體管理的優勢:能夠動态的滿足對記憶體空間的需求。
(三)
共享庫:共享庫使得可執行檔案中不再需要包含公用的庫例程,而隻需要在所有程序都可引用的存儲區中維護這種庫例程的一個副本。程式第一次執行或第一次調用某個庫函數時,用動态連結方法将程式與共享庫函數相連結。這減少了每個可執行檔案的長度,但增加了一些運作時間開銷。共享庫的另一個優點是可以用庫函數的新版本代替老版本,而不需要對使用該庫的程式重新連接配接編輯。