程式四大段

2021-06-18 06:05:28 字數 850 閱讀 5123

今天寫出了這樣一行**:

static pt_pagelist ptstatic = ptbookdesc->ptpagelist;

編譯器報錯:initializer element is not constant.

導致這個錯誤是因為我對程式的分段沒弄清楚,寫過彙編以及連線指令碼的就會知道,乙個程式分為最基本的 .text,.data,.rdata,.bss 四個段(可以新增自定義段)。

.text

**段,這個存放**的,用彙編角度來看就是指令。

.rdata

唯讀資料段,存放常量,字元常量,const常量,據說還存放除錯資訊。

.data

資料段,存放已經初始化好的全域性變數和靜態變數。

.bss

bss段, 存放未初始化的全域性變數和靜態變數。

.rdata,.data,.bss都是存放的資料,那這三個段是什麼時候初始化的呢?除了.bss段,.rdata,.data段的值都是在編譯的時候就確定了,並且將其編譯進了可執行檔案,經過反彙編都能找得到。那bss段呢?寫過微控制器啟動**就會了解到bss段是在**執行的時候手動編寫彙編**將其初始化為0的(這就是未初始化的全域性和靜態變數預設值為0的根源),為什麼要在**執行的時候手動初始化而不像其他段那樣由編譯器來做呢?因為bss段裡面的資料都是要被置0的,放在**執行時做,只需要幾行彙編**就可以初始化好bss所有的資料,這樣可執行檔案就可以不用再包含bss段了,從而使得編譯出來的可執行檔案盡量小。

再回到我一開始遇到的問題,既然static變數時在編譯的時候確定其值,那麼我在申明static pt_pagelist ptstatic時給他賦了個臨時變數就是錯誤的!因為這個時候**還沒有執行呢,更沒有臨時變數了!所以要給其賦乙個常量!

linux 程序的 5 大段

bss段 bss段 bss segment 通常是指用來存放程式中資料段 資料段 data segment 通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於靜態記憶體分配。資料段 資料段 data segment 通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料...

程式設計師四大忌

一忌 輕易言敗,沒有自信 沒有永不放棄精神的程式設計師,只是乙個有程式設計師名號的假程式設計師。乙個真正的程式設計師,知道在程式設計的過程中,可能會遇到不計其數的困難和問題,可能有極多的挫折和失敗,而成功只有一次。就為解決乙個問題,我們可能連續十幾甚至幾十小時的坐在計算機前不停的工作。乙個問題解決了...

程式設計師四大忌

一忌 輕易言敗,沒有自信 沒有永不放棄精神的程式設計師,只是乙個有程式設計師名號的假程式設計師。乙個真正的程式設計師,知道在程式設計的過程中,可能會遇到不計其數的困難和問題,可能有極多的挫折和失敗,而成功只有一次。就為解決乙個問題,我們可能連續十幾甚至幾十小時的坐在計算器前不停的工作。乙個問題解決了...