淺談c語言程式碼段 資料段 bss段

Sun_Shine_999發表於2018-03-24

程式碼段、資料段、bss段

(1)編譯器在編譯程式的時候,將程式中的所有的元素分成了一些組成部分,各部分構成一個段,所以說段是可執行程式的組成部分。

(2)程式碼段:程式碼段就是程式中的可執行部分,直觀理解程式碼段就是函式堆疊組成的。

(3)資料段(也被稱為資料區、靜態資料區、靜態區):資料段就是程式中的資料,直觀理解就是C語言程式中的全域性變數。(注意:全域性變數才算是程式的資料,區域性變數不算程式的資料,只能算是函式的資料)

(4)bss段(又叫ZI(zero initial)段):bss段的特點就是被初始化為0,bss段本質上也是屬於資料段,bss段就是被初始化為0的資料段。 注意區分:資料段(.data)和bss段的區別和聯絡:二者本來沒有本質區別,都是用來存放C程式中的全域性變數的。區別在於把顯示初始化為非零的全域性變數存在.data段中,而把顯式初始化為0或者並未顯式初始化(C語言規定未顯式初始化的全域性變數值預設為0)的全域性變數存在bss段。

有些特殊資料會被放到程式碼段

(1)C語言中使用char *p = “linux”;定義字串時,字串”linux”實際被分配在程式碼段,也就是說這個”linux”字串實際上是一個常量字串而不是變數字串。

(2)const型常量:C語言中const關鍵字用來定義常量,常量就是不能被改變的量。

const的實現方法至少有2種:

第一種就是編譯將const修飾的變數放在程式碼段去以實現不能修改(普遍見於各種微控制器的編譯器);

第二種就是由編譯器來檢查以確保const型的常量不會被修改,實際上const型的常量還是和普通變數一樣放在資料段的(gcc中就是這樣實現的)。

顯式初始化為非零的全域性變數和靜態區域性變數放在資料段

(1)放在.data段的變數有2種:第一種是顯式初始化為非零的全域性變數。第二種是靜態區域性變數,也就是static修飾的區域性變數。(普通區域性變數分配在棧上,靜態區域性變數分配在.data段)

未初始化或顯式初始化為0的全域性變數放在bss段 (1)bss段和.data段並沒有本質區別,幾乎可以不用明確去區分這兩種。

相關文章