動態記憶體分配

2021-08-19 16:56:54 字數 2274 閱讀 2800

內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數

在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時,這些儲存但願自動被釋放。效率很高,但是分配的記憶體容量比較有限

在堆上分配也稱為動態記憶體分配:程式在執行的時候用malloc等函式申請任意多少的記憶體,程式設計師自己負責在何時用free釋放記憶體。動態記憶體分配的生存期由我們自己決定,使用非常靈活,但是問題相對也比較多;注意://如果沒有釋放的話,很容易就會造成記憶體溢位,因為堆中的記憶體塊是全域性的,因此不會因為函式的呼叫而結束

1:malloc函式:需要用到的標頭檔案malloc.h

void *malloc(size_t size) //————–>返回的是乙個通用型別的指標,根據需要去進行強轉; 

功能:允許從空閒記憶體池中分配連續記憶體但不初始化 

引數:size引數實際就是乙個所需位元組數的整數 malloc(20); 

返回:若分配成功則返回乙個指向該記憶體塊的指標,在使用時可根據需要做強制型別轉換,否則返回null(空指標)//需要判空 

free(p);//釋放記憶體空間,將記憶體釋放出來給系統;

free函式與malloc函式是成對出現的;

申請malloc的時候盡量去給它進行一下初始化,防止後面出現一些不確定性的東西;

malloc的生命週期:只要沒有呼叫free這個函式,程序沒有結束,那麼此時,這個函式的生命週期就會一直存在在記憶體中;它是存放在堆空間中的,它不會因為你去函式呼叫的結束自動去釋放,堆當中的記憶體是全域性的

如:int p = (int )malloc(n*sizeof(int)); //在空閒記憶體池中分配連續記憶體n*sizeof(int)個位元組的堆記憶體空間

#include

#include

void out(int *p,int n)

}int main(void)

else

return

0;}

void *colloc(size_t num_elements,size_t element_size); 

功能:功能同malloc是一樣的,但是作初始化

引數:num_elements是所需的元素的數量,element_size是每個元素的位元組數 

返回:同malloc函式一樣 

也是需要與free(p)進行對稱使用

#include

#include

int main(void)

printf("\n");

free(p);

}else

return

0;}

void *realloc(void *ptr,size_t new_size); 

功能:在指標ptr指向的記憶體基礎上擴大或者縮小記憶體 

引數:ptr是指向先前通過malloc,calloc和realloc函式後分配的記憶體塊的指標,new_size是記憶體塊的新尺寸,可能大於或者小於原有記憶體尺寸;這個是追加到new_size的新的記憶體 

realloc在c語言中也被稱為動態陣列; 

realloc函式使用的注意點: 

1:當擴充套件記憶體的時候,不會對新增進記憶體塊的位元組進行初始化 

2:若不能調整記憶體則返回null,但原有記憶體中的資料是不會發生改變的 

3:若第乙個引數為null那麼功能 等同與malloc函式,若第二個引數為0,那麼會釋放呼叫記憶體塊

realloc(null,10*size(int)) 等同malloc(10*sizeof(int));

realloc(p,0); 等同於free

#include

#include

#include

void out(int *p ,int n)

}int main(void)

free之後如果還有這塊記憶體位址的話,此時這塊記憶體歸還給了系統,(可能這塊記憶體還處於乙個空閒狀態)但是還是可以對其進行操作。裡面的值短暫的會保留。

free之後,申請記憶體的那個指標就會變成野指標(宣告了,但是沒有任何指向的指標),有時候會出現野指標錯誤; 

所以盡量在操作之後:將指標置為null 

p=null; 

注意:申請和釋放是成對的,所以程式是不能進行多次free的,否則會崩潰的

動態記憶體分配

在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...

動態記憶體分配

為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...

動態記憶體分配

c的儲存類別有4種 自動的 auto 靜態的 statics 暫存器的 register 外部的 extern 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...