C記憶體管理

2021-08-09 17:00:35 字數 1423 閱讀 8845

c語言中記憶體主要分為三部分,  堆,  棧 ,   資料區

普通區域性變數. 。所有的

自動變數、函式形參

都儲存在棧中

特點:執行自動分配**:棧是系統自動管理,不需要程式設計師去處理。

反覆使用 :棧內存在程式中是一塊空間位址,程式反覆使用這塊位址

髒記憶體 :由於棧的反覆使用,每次使用後程式不去清理,分配時原來的值還會存在

臨時性 :(函式不能返回棧變數的指標,因為這個空間是臨時的)

棧溢位 :作業系統給予棧的大小是固定的,函式中不斷分配棧記憶體會導致棧記憶體使用完,然後會溢位。

注意:1: 每個執行緒都有自己的棧

2:不能將乙個棧變數的位址通過函式的返回值返回,因為棧的生命週期比較短。例如區域性變數使用後,函式結束時程式會釋放相應的棧記憶體。

3: 棧不會很大,程式中直接將較大的陣列儲存在函式內棧變數中,會導致棧溢位。例如:在某個函式中char array[1024*1024*1024] = ;

4: c語言中函式引數入棧的順序是從右到左

5: c語言中形參和實參之間是值傳遞。

二:堆     (先進先出)

特點:作業系統堆管理器:堆管理器是作業系統的一塊模組,記憶體分配靈活。

大塊記憶體 :是一塊容量很大的作業系統空間,每個程序按照各自需求進行申請,使用結束後要注意釋放。記憶體大小遠遠大於棧記憶體。一般比較複雜的資料型別都是放在堆中。

手動申請釋放 :malloc 申請memset 記憶體初始化   free釋放

髒記憶體 :堆記憶體也會重複使用,在釋放前不會清除,

臨時性 :生命週期在malloc 和 free 之間,在此之外無法訪問。

記憶體洩露 :申請的堆記憶體沒有釋放,會導致記憶體洩露,

堆在記憶體中位於bss區和棧區之間

三:**段,資料段,bss段

**段(text):程式可執行部分,直觀理解就是函式堆疊組成

c語言中定義字串時 char *p = "hello";   字串「hello」 實際分配在**段。因為這個字串是常量字串,不是變數字串。

const關鍵字用來定義常量,常量就是不能被改變的量。const有兩種實現方法:

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

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

資料段(data):c語言程式中的全域性變數(全域性變數時程式的資料,區域性變數是函式的資料)

顯示初始化為非0 的全域性變數和靜態區域性變數放在資料段(即static 修飾的區域性變數)()

bss段(未初始化資料區):被初始化為0的資料段。

int a = 0;    //a在全域性已初始化資料區 

char *p1;    //p1在bss區(未初始化全域性變數) 

main() 

C 記憶體管理 C 記憶體分類

c 記憶體管理 記憶體分類 moakap 在編寫程式過程中,程式設計師必須清楚程式記憶體的分配機制,合理進行記憶體管理,這樣才能得到高效的程式。同時,如果對c 記憶體分配基本概念不理解,使用不當,一方面浪費了寶貴的記憶體資源,降低了程式執行效率,另一方面還會造成程式中意想不到的錯誤。在 c 程式中,...

C 記憶體管理

在嵌入式系統中使用c 的乙個常見問題是記憶體分配,即對new 和 delete 操作符的失控。具有諷刺意味的是,問題的根源卻是c 對記憶體的管理非常的容易而且安全。具體地說,當乙個物件被消除時,它的析構函式能夠安全的釋放所分配的記憶體。這當然是個好事情,但是這種使用的簡單性使得程式設計師們過度使用n...

c 記憶體管理

這裡對我暫時所了解的記憶體機制做個記錄,以後再補。首先是記憶體分配 記憶體主要分為3個部分 一是從靜態儲存區域分配。編譯時分配好,主要存放全域性變數,static變數,程式結束釋放。二是從堆疊區域分配。函式內區域性變數存放的地方。隨變數生命週期自動釋放。效率較高,但大小有限。三是從記憶體池分配,即從...