動態記憶體分配

2021-08-21 17:10:22 字數 1365 閱讀 9715

動態記憶體:動態的建立記憶體,申請記憶體空間為變數;存放於堆(heap)區,不能通過變數名或陣列名引用,只能通過指標引用

,在windows中,堆中最大的連續記憶體塊為1.3g左右。

ansi標準建議設有4個有關動態儲存分配函式,即  malloc(),  calloc(),   realloc(),  free();   標頭檔案為

#include
malloc:  從空閒記憶體中分配長度為size連續空間,但不初始化;

函式原型:void*malloc(unsigned size)

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

生命週期:從建立到free釋放;只要沒有呼叫free函式,程序就沒有結束;與free函式對稱使用

calloc: 功能同malloc相同,從空閒記憶體中分配n個長度為size連續空間,但初始化為0《使用率低》;

函式原型:void*calloc(unsigned n,unsigned size)

int *p=(int *)calloc(n*sizeof(int));
返回:同malloc函式一樣;

引數:第乙個是所需開闢的記憶體單元數量;第二個是每乙個單元的位元組大小

生命週期:從建立到free釋放;只要沒有呼叫free函式,程序就沒有結束;與free函式對稱使用

realloc: 動態擴大或縮小申請的記憶體《分配新的大記憶體,需要更新位址》

函式原型:  void * realloc(void *p,unsigned size)

p=(int*)realloc(p,20*sizeof(int))
返回:若申請失敗返回空(null);但原有的記憶體不會發生改變

free:釋放記憶體空間,將內釋放出來給系統;解決記憶體洩漏問題;

函式原型:void free(void *p)

free(p);
《申請與釋放是成對的,所以程式不能多次free,否則會崩潰》

free崩潰的4個原因

1、越界

#include#includeint main()

free(p1);

return 0;

}

2、指標移動,找不到頭

動態記憶體分配記憶體的頭部和尾部含有資訊,在指標移動時位元組的位址發生改變,首位元組的位址被p++改變後找不到頭部,

3、重複釋放記憶體

記憶體的動態分配與釋放是對稱使用的

4、釋放不是動態建立的記憶體

動態記憶體分配

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

動態記憶體分配

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

動態記憶體分配

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