c語言學習筆記之記憶體分割槽

2021-07-08 19:52:33 字數 1038 閱讀 2721

c語言有五大記憶體分割槽,分別是棧,堆,全域性區,常量區,**區。

棧:在需要的時候由編譯器(系統)自動分配,在不需要的時候會由系統自動**的儲存區,記憶體由系統管理,函式中定義的變數儲存在棧中,當呼叫函式的時候函式中定義的變數會被加到棧中,當函式離開的時候,被新增的變數會從棧中移除,棧在最高的位址上,所以新增的變數位址會逐漸變小,裡面的內容可讀可寫

堆:是一塊動態記憶體,由程式猿自己申請自己釋放的記憶體空間,其記憶體由程式猿自己管理,當程式執行時候動態分配給變數,它可以長時間存在,所以,申請乙個堆記憶體就必須有釋放的過程,同時指向堆記憶體的指標不能改變,否則這個堆記憶體永遠都得不到釋放,除非程式崩潰或者執行結束導致系統**程式所在的記憶體,這樣就很容易造成記憶體洩漏(是指程式執行期間,程式結束後程式所占用的記憶體就釋放了),它是可讀可寫的。

全域性區(globals):定義在函式外邊的全域性變數和靜態變數就放在這個這裡,這裡的變數在程式已啟動就被建立,你可以自由的更改他們,所以是由系統管理可讀可寫的記憶體。

常量區(constants):常量在系統一執行被建立,常量區的記憶體是唯讀的,如常量字串就放在這個區。你可以讀他們,但是不可以修改他們,記憶體由系統管理

**區(code):**區是唯讀的,該區域是用來存放程式的**的,記憶體由系統管理

注意:這裡的棧不是資料結構中所說的棧

動態儲存空間(堆)的使用(了解):

free(void *p):告訴作業系統這塊儲存空間不再使用了,並不會立即**,對空指標無效,即不能多次釋放同乙個指標指標的堆記憶體空間

有malloc就有free,不然容易造成記憶體洩漏。

不要改變指向堆記憶體的指標

使用場景:面試考資料結構要用到堆,如實現佇列

多種申請堆記憶體的函式,如:malloc,calloc

c語言學習之記憶體重疊

遇到這樣乙個問題,當陣列進行拷貝的時候,如果是在同乙個陣列內拷貝,就有可能出現記憶體重疊的問題,比如 includevoid copy int a,int b,int len b從開始複製len個數字到a int main copy arr 0 arr 3 7 4,5,6,7,8,9,10,8,9,...

C語言學習 記憶體分割槽

1.1 資料型別 對函式返回的限定 void fun int a 對函式引數的限定 int fun void void a error,不能確定分配記憶體空間的大小void p ok,萬能指標,指標型別都是4個位元組,函式引數,函式有返回值 1.void 可以指向任何型別的資料,被稱為萬能指標 vo...

C 之記憶體分割槽

程式執行後 new操作符 c 程式在執行時,將記憶體大方向劃分為4個區域 不同區域存放的資料,賦予不同的生命週期 在程式編譯後,生成了exe可執行程式,未執行該程式前分為兩個區域 區 存放 cpu 執行的機器指令 區是共享的,共享的目的是對於頻繁被執行的程式,只需要在記憶體中有乙份 即可 區是唯讀的...