記憶體與指標

記憶體區段(text、data、BSS、堆疊、堆積)

/ BSS: bee-ess-ess /

程式執行時,作業系統不會給它一坨沒有分別的記憶體——它把定址空間佈置成一個個社區,每個社區各有職責與自己的規則。認識這五個經典區域,就能知道任何一樣東西住在哪裡,以及為什麼有些位址可寫、有些唯讀、有些會長大、有些會縮小。

由低位址到高位址,五個區域一覽。text(也叫程式碼區段)放程式的機器指令;它是唯讀的,這樣執行中的程式碼無法改寫自己。data 放以非零值開始的全域與靜態變數,由可執行檔複製而來。BSS 放以零開始的全域與靜態變數——檔案不會存一整塊零,只記下大小,由載入器把這塊區域清零(這就是為什麼未初始化的全域變數可靠地為 0)。堆積(heap)是動態配置的區域;當你要記憶體時,它往高位址方向向上長。堆疊(stack)放函式呼叫的框架——區域變數、返回位址——並往另一個方向、向下長,隨著呼叫的巢狀加深。堆積上升、堆疊下降地朝彼此靠近,中間留下一大片空閒的間隙。

這張地圖解釋了許多日常事實。字串字面值住在唯讀記憶體,所以試圖修改它會當掉;區域變數住在堆疊上,函式回傳時就消失;全域變數住在 data 或 BSS,存活整個執行期;而 malloc 出來的區塊住在堆積上,直到你 free 它。確切的機制——堆疊框如何建立、堆積如何管理——是接下來的條目;這裡是把它們串起來的概觀。

int g = 7;(data)與 int z;(BSS,清零初始化)是全域變數;在函式內部,int local; 住在堆疊上,而 char *p = malloc(100); 把 p 的那 100 個位元組放在堆積上,p 本身則是堆疊上的一個區域變數。

全域變數在 data/BSS、區域變數在堆疊、malloc 出的區塊在堆積。

這些是單一行程定址空間的經典邏輯區段,是對「真實 ELF 可執行檔與執行中行程如何組織」的一種簡化。它們位於虛擬記憶體,不是固定的實體晶片——虛擬如何對映到實體留到後面的 l 領域。text/data/BSS 這些名字源自歷史,但至今通用。

又稱
program memory layoutsegments記憶體佈局