C語言中的記憶體分配與釋放

2022-03-06 14:09:12 字數 1655 閱讀 4452

對c語言一直都是抱著學習的態度,很多都不懂,今天突然被問道c語言的記憶體分配問題,說了一些自己知道的,但感覺回答的並不完善,所以才有這篇筆記,總結一下c語言中記憶體分配的主要內容。

剛剛在一篇博文看到乙個簡單的問題:

//

code1

char*tostr()

intmain()

//code2

char*tostr()

intmain()

兩段**都很簡單,輸出一段字元,型別不同,乙個是char*字串,乙個是char資料。

結果你知道嗎? 這個我確實知道,相信大部分人也都回知道,必然有乙個不好使,或者兩個都不好使!!!都對就沒意思了~

結果:第乙個正確輸出,第二個輸出亂碼。

原因:在於區域性變數的作用域和記憶體分配的問題,第一char*是指向乙個常量,作用域為函式內部,被分配在程式的常量區,直到整個程式結束才被銷毀,所以在程式結束前常量還是存在的。而第二個是陣列存放的,作用域為函式內部,被分配在棧中,就會在函式呼叫結束後被釋放掉,這時你再呼叫,肯定就錯誤了。

什麼是區域性變數、全域性變數和靜態變數?

顧名思義,區域性變數就是在乙個有限的範圍內的變數,作用域是有限的,對於程式來說,在乙個函式體內部宣告的普通變數都是區域性變數,區域性變數會在棧上申請空間,函式結束後,申請的空間會自動釋放。而全域性變數是在函式體外申請的,會被存放在全域性(靜態區)上,知道程式結束後才會被結束,這樣它的作用域就是整個程式。靜態變數和全域性變數的儲存方式相同,在函式體內宣告為static就可以使此變數像全域性變數一樣使用,不用擔心函式結束而被釋放。

void *malloc(size_t size);

void free(void *p);

/*一般這樣用

struct elem *p;

p = (struct elem*)malloc(sizeof(struct elem))

void free(p)

*/

malloc函式的實質體現在,它有乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊錶。呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊。然後,將該記憶體塊一分為二(一塊的大小與使用者請求的大小相等,另一塊的大小就是剩下的位元組)。接下來,將分配給使用者的那塊記憶體傳給使用者,並將剩下的那塊(如果有的話)返回到連線表上。呼叫free函式時,它將使用者釋放的記憶體塊連線到空閒鏈上。到最後,空閒鏈會被切成很多的小記憶體片段,如果這時使用者申請乙個大的記憶體片段,那麼空閒鏈上可能沒有可以滿足使用者要求的片段了。於是,malloc函式請求延時,並開始在空閒鏈上翻箱倒櫃地檢查各記憶體片段,對它們進行整理,將相鄰的小空閒塊合併成較大的記憶體塊。如果無法獲得符合要求的記憶體塊,malloc函式會返回null指標,因此在呼叫malloc動態申請記憶體塊時,一定要進行返回值的判斷。

//

main.cpp

int a = 0; //

全域性初始化區

char *p1; //

全域性未初始化區

main()

此外,還有realloc(重新分配記憶體)、calloc(初始化為0)、alloca(在棧上申請記憶體,自動釋放)等。

C語言中記憶體分配

一 static在c語言裡面可以用來修飾變數,也可以用來修飾函式。1 先看用來修飾變數的時候。變數在c語言裡面可分為存在全域性資料區 棧和堆裡。其實我們平時所說的堆疊是棧而不是堆,不要弄混。例如 在file.c中 int a int main int b int c int malloc sizeo...

C語言中的記憶體分配

1 段 text 裡面儲存的是可執行程式的二進位制指令,為了防止被意外修改,段一般是唯讀的 2 全域性段 資料段data 儲存被初始化過的全域性變數 靜態變數 3 bss段 靜態資料段 儲存靜態變數 被static修飾過的變數 和末初始化的全域性變數,這段內存在程式執行前會被初始化為0 4 堆 he...

C語言記憶體動態分配與釋放

c語言的函式malloc和free 1 函式malloc和free在標頭檔案中的原型及引數 void malloc size t size 動態配置記憶體,大小有size決定,返回值成功時為任意型別指標,失敗時為null。void free void ptr 釋放動態申請的記憶體空間,呼叫free ...