C語言 記憶體分配

2021-09-29 06:12:37 字數 2798 閱讀 8890

1,記憶體分配的型別:

在c/c++中記憶體分為5個區,分別為棧區、堆區、全域性/靜態儲存區、常量儲存區、**區。

靜態記憶體分配:編譯時分配。包括:全域性、靜態全域性、靜態區域性三種變數。

動態記憶體分配:執行時分配。包括:棧(stack): 區域性變數。堆(heap): c語言中用到的變數被動態的分配在記憶體中。(malloc或calloc、realloc、free函式)

2.變數的記憶體分配:

棧區(stack):指那些由編譯器在需要的時候分配,不需要時自動清除的變數所在的儲存區,如函式執行時,函式的形參以及函式內的區域性變數分配在棧區,函式執行結束後,形參和區域性變數去棧(自動釋放)。棧記憶體分配運算內建與處理器的指令集中,效率高但是分配的記憶體空間有限。

堆區(heap):指哪些由程式設計師手動分配釋放的儲存區,如果程式設計師不釋放這塊記憶體,記憶體將一直被占用,直到程式執行結束由系統自動收回,c語言中使用malloc,free申請和釋放空間。

靜態儲存區(static):全域性變數和靜態變數的儲存是放在一塊的,其中初始化的全域性變數和靜態變數在乙個區域,這塊空間當程式執行結束後由系統釋放。

常量儲存區(const):常量字串就是儲存在這裡的,如「abc」字串就儲存在常量區,儲存在常量區的唯讀不可寫。const修飾的全域性變數也儲存在常量區,const修飾的區域性變數依然在棧上。

程式**區:存放源程式的二進位制**。

申請方式:棧由編譯器管理,堆的分配和釋放由程式設計師管理。

申請大小:棧是向低位址生長的資料結構,是一塊連續的記憶體,能從棧中獲得的記憶體較小,編譯期間確定大小;堆是向高位址生長的資料結構,是乙個不連續的儲存空間,,記憶體獲取比較靈活,也較大。

棧與堆中的儲存內容

棧:在函式呼叫時,第乙個進棧的是主函式中的最後一條指令的位址,然後是函式的各個引數,在大多 數的c編譯器中,引數是由右往左入棧的,然後是函式中的區域性變數(靜態變數是不入棧的),當本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向最開始存的位址,也就是主函式中的下一條指令,程式由該點開始執行;

堆:一般是在堆的頭部用乙個位元組存放堆的大小,堆中的具體內容由程式設計師安排。

1.malloc函式;

函式原型: void * malloc (size_ t size) ;

功能:

1.開闢一塊size大小的連續堆記憶體。

2.size表示堆 上所開闢記憶體的大小(位元組數)。

3.函式返回值是乙個指標,指向剛剛開闢的記憶體的首位址。

4.如果開闢記憶體失敗, 返回乙個空指標,即返回值為null。

5.當記憶體不再 使用時,應使用free ()函式將記憶體塊釋放

6.使用時 必須包含標頭檔案或

2.calloc函式;

函式原型: void * calloc(size_ t n, size t size);

功能:

1.在記憶體的動態儲存區中分配n個長度為si ze的連續空間,

2.函式返回乙個指向分配起始位址的指標;

3.如果分配不成功,返回null。

4.當記憶體不再 使用時,應使用free ()函式將記憶體塊釋放。

5.使用時 必須包含標頭檔案或

3.realloc函式;

函式原型:

void * realloc(void * mem_ address, size_ t newsize) ;

功能:

1.為已有記憶體的變數重新分配新的記憶體大小(可大、可小) ;

2.先判斷當前的指標是否有足夠的連續空間,如果有,擴大mem_address指向的位址,並且將mem_ address返回;

3.如果空間不夠,先按照newsize指定的大小分配空間,將原有資料從頭到尾拷貝到新分配的記憶體區域,而後釋放原來mem_address 所指記憶體區域(注意:原來指標是自動釋放,不需要使用free),同時返回新分配的記憶體區域的首位址。即重新分配儲存器塊的位址。

4.如果重新分配成功則返回指向被分配記憶體的指標;

5.如果分配不成功,返回null。

6.當記憶體不再使用時,應使用free ()函式將記憶體塊釋放

7.使用時必須包含標頭檔案或

4.free函式。

函式原型: void free (void *ptr) ; //ptr為要釋放的記憶體指標。

free():釋放指標變數在堆區上的記憶體空間,不能釋放棧上的記憶體空間,free要與malloc(calloc、realloc)成對使用。

注意:如果malloc(calloc、realloc) 比 free 多, 會造成記憶體洩漏;

如果malloc(calloc、realloc) 比 free 少,會造成二次刪除, 破壞記憶體,導致程式崩潰。

C語言記憶體分配

c語言的記憶體分配主要有5個區域 1 棧區 在執行函式時,函式內的區域性變數 不包括static變數 函式返回值的儲存單元在棧區上建立。函式執行結束時這些儲存單元自動被釋放。棧區記憶體分配運算內置於處理器的指令集中,效率很高,但分配的記憶體容量有限。2 堆區 程式在執行的時候用malloc call...

C語言記憶體分配

c語言的記憶體分配主要有5個區域 1 棧區 在執行函式時,函式內的區域性變數 不包括static變數 函式返回值的儲存單元在棧區上建立。函式執行結束時這些儲存單元自動被釋放。棧區記憶體分配運算內置於處理器的指令集中,效率很高,但分配的記憶體容量有限。2 堆區 程式在執行的時候用malloc call...

C語言記憶體分配

objective c從名字來看就可以知道是一門超c語言,所以了解c語言的記憶體模型對於理解objective c的記憶體管理有很大的幫助。c語言記憶體模型圖如下 從圖中可以看出記憶體被分成了5個區,每個區儲存的內容如下 棧區在什麼時候釋放記憶體呢?我們通過下面的乙個例子來說明下 void prin...