動態記憶體分配

2021-06-16 19:20:38 字數 1432 閱讀 7360

為什麼使用動態記憶體分配?

c語言中的一切操作都是基於記憶體的

變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定

.定義陣列的時候必須指定陣列唱的

.而陣列長度是在編譯期就必須決定的

需求:程式執行的過程中,可能需要使用一些額外的記憶體空間

malloc和free

malloc和free用於執行動態記憶體分配和釋放

malloc所分配的是一塊連續的記憶體,以位元組為單位,並且不帶任何的型別資訊

free用於將動態記憶體歸還系統

void* malloc(size_t size);

void  free(void* pointer);

注意:malloc實際分配的記憶體可能會比請求的稍微多一點,但是不能依賴於編譯器的這個行為

當請求的動態記憶體無法滿足時malloc返回null

當free的引數為null時,函式直接返回

calloc和realloc   :malloc的同胞兄弟

void* calloc(size_t num, size_t size);      

//num是單元的數量,size是單元的大小

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

//pointer指向要修改的記憶體空間

calloc的引數代表所返回記憶體的型別資訊, 如要申請一20個元素的整型陣列:(int*)calloc(20, 4);

calloc會將返回的記憶體初始化為0

realloc用於修改乙個原先已經分配的記憶體塊大小

.在使用realloc之後應該使用其返回值

.當pointer的第乙個引數為null時,等價於malloc

例1:

#include #include int main()

pi = (int*)realloc(pi, 10 * sizeof(int)); //把pi指向的空間擴大,原來有的值不會改變,擴大的空間也是隨機值

for(i=0; i<10; i++)

free(pi);

free(ps); //不管誰申請的都可以free掉

return 0;

}

編譯執行:

小結:

動態記憶體分配是c語言中的強大功能

程式能夠在需要的時候有機會使用更多的記憶體

malloc單純的從系統中申請固定位元組大小的記憶體

calloc能以型別大小為單位申請記憶體並初始化為0

realloc用於充值記憶體大小

更深入的講解

動態記憶體分配

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

動態記憶體分配

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

動態記憶體分配

在c語言中動態記憶體分配函式是malloc 函式名 malloc 函式原型 extern void malloc unsigned int num bytes 函式功能 分配記憶體 引數 記憶體大小 返回值 void型別指標 函式名 free 函式原型 void free void ptr 函式功能...