C C 記憶體分割槽

2021-09-25 03:15:56 字數 943 閱讀 9549

堆區

由程式設計人員手動申請,手動釋放,若不手動釋放,程式結束後由系統**,生命週期是整個程式執行期間。使用malloc或者new進行堆的申請,堆的總大小為機器的虛擬記憶體的大小。(ps-self view: 由malloc申請的叫做堆區,new申請的叫做自由儲存區)。

棧區由系統進行記憶體的管理。主要存放函式的引數以及區域性變數。在函式完成執行,系統自行釋放棧區記憶體,不需要使用者管理。整個程式的棧區的大小可以再編譯器中由使用者自行設定,vs中預設的棧區大小為1m,可通過vs手動更改棧的大小。64bits的linux預設棧大小維10mb,可通過ulimit -s臨時修改。

全域性/靜態儲存區

全域性/靜態區內的變數在程式編譯階段已經分配好記憶體空間並初始化。這塊內存在程式的整個執行期間都存在,他主要存放靜態變數、全域性變數和常量。(常量什麼時候存在全域性/靜態區了?)

注意:1.這裡不區分初始化和未初始化的資料區,是因為靜態儲存區內的變數若不顯示初始化,則編譯器會自動以預設的方式進行初始化,即靜態儲存區內不存在未初始化的變數。

2. 靜態儲存區內的常量分為常變數和字串常量,一經初始化,不可修改。靜態儲存內的常變數是全域性變數,與區域性常變數不同,區別在於區域性常變數存放於棧,實際可間接通過指標或者引用進行修改,而全域性常變數存放於靜態常量區則不可以間接修改。(這裡有疑問,如何修改)

3. 字串常量儲存在全域性/靜態儲存區的常量區,字串常量的名稱即為它本身,屬於常變數。

**區存放程式體的二進位制**。比如所寫的函式,都是在**區。

const int d=1;//棧區

static const int d;//靜態常量區

總結

資料區包括:堆,棧,全域性/靜態儲存區。

全域性/靜態儲存區:常量區(靜態常量區),全域性區(全域性變數區),靜態變數區(靜態區)。

常量區:字串常量區和常變數區。

**區:存放程式編譯後的二進位制**,不可定址區。

c c 記憶體分割槽

主要用於儲存函式的引數和區域性變數。棧區由系統進行記憶體管理,在函式執行完成時,系統自動釋放棧區的記憶體,而不需要使用者的參與,整個程式的棧區的大小可以在編譯器中由使用者自行設定。由使用者手動申請,手動釋放。如果使用者忘記對所申請的記憶體資源進行釋放,該記憶體資源可能會在程式結束時由操 作系統進行釋...

c c 程式的記憶體分割槽模型詳解

我們要想執行我們編寫的c程式,那麼第一步需要對這個程式進行編譯。預處理 巨集定義展開 標頭檔案展開 條件編譯,這裡並不會檢查語法 編譯 檢查語法,將預處理後檔案編譯生成彙編檔案 彙編 將彙編檔案生成目標檔案 二進位制檔案 在沒有執行程式前,也就是說程式沒有載入到 記憶體前,可執行程式內部已經分好3段...

C C 編譯的程式占用的記憶體分割槽

c c 編譯的程式占用的記憶體分割槽 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。...