1、問什麼要動態記憶體管理?
在進行資料儲存的時候,我們經常的做法是利用陣列開闢指定大小的空間用以儲存資料,但是陣列的具體大小取決於輸入的資料,因此往往在程式執行時才知道所需陣列的記憶體空間的大小。為了達到對記憶體空間的合理使用,這就要就我們根據輸入資料的不同來開闢不同大小的記憶體空間,繼而出現動態記憶體分配。動態記憶體分配在程式執行時為指定的變數分配記憶體,其分配的記憶體空間位於堆區。此外,在棧區可開闢的空間大小小於堆區,因此在需要開闢較大的記憶體空間時,也需要使用動態記憶體分配。
2、動態記憶體分配函式
malloc、calloc、realloc之間的聯絡與區別:malloc、calloc函式均用於在堆區開闢指定大小的記憶體空間,但是malloc函式在開闢時,只是開闢指定大小的記憶體空間,不對開闢好的內部才能進行初始化操作,而callo函式在開闢空間的同時對該空間的內容初始化為0,其返回值的型別均為void *。realloc函式用來修改已經分配好記憶體空間的大小,其返回值也為void*;realloc函式在調整記憶體空間時的兩種情況:①原有空間之後有足夠大小的空間:這種情況在進行記憶體擴增的時,直接在原有空間的基礎上進行擴增,返回值仍為原空間的位址;②原有記憶體空間之後的空間不足:這種情況在進行記憶體擴增時,則在堆區重新找到一塊合適且連續的記憶體空間,並把原來空間的內容拷貝至新的記憶體上,最後返回新開闢記憶體空間的位址。在使用完所開闢的空間之後,需要使用free函式對開闢的空間進行釋放,釋放後的指標為野指標,需要置為空。若未釋放開闢的空間,則會造成記憶體洩漏的問題。
//函式原型
void *malloc(size_t size); //開闢大小為size的記憶體空間
int *ptr = (int *)malloc(1000);
void *calloc(size_t num, size_t size); //開闢num個大小為size的空間
int *ptr1 = (int *)calloc(100,sizeof(int));
void *realloc(void *ptr, size_t size); //修改ptr指向的空間大小為size
int *p = (int *)realloc(ptr, 100);
記憶體空間的開闢、驗證即釋放
int *ptr = (int *)malloc(100);
if(null == ptr)
//....對空間進行操作
free(ptr);
ptr = null;
3.柔性陣列:用以解決結構體中需要變長陣列的問題
在學習完動態記憶體分配之後,對於變長陣列的空間開闢,我們首先想到的是進行動態記憶體分配,但是如果需要在結構體內定義乙個變長陣列該如何處理?對於這個問題有兩種解決方案,一種是對結構體和結構體內的變長陣列使用兩次動態記憶體分配,另一種是使用柔性陣列。在實際的操作中,第二種方式會明顯比第一種簡單,這裡所說的簡單主要體現在方便記憶體釋放上。下邊給出兩種方式下的編碼demo:
#include #include #include struct a;
struct array;
int main()
p->num = 100;
for (int i = 0; i < p->num; i++)
free(p);
//在結構體中形成變長的陣列:方式一:
struct array *arr = (struct array *)malloc(sizeof(struct array));
if (null == arr)
arr->num = 100;
arr->mem = (int *)malloc(arr->num*sizeof(int));
if (null == arr->mem)
//如何釋放空間:釋放由內向外,申請由外向內
free(arr->mem);
free(arr);
system("pause");
return 0;
}
C語言學習筆記 動態記憶體分配
記憶體分割槽 說明 程式 區 code area 存放函式體的二進位制 靜態資料區 data area 也稱全域性資料區,包含的資料型別比較多,如全域性變數 靜態變數 一般常量 字串常量。其中 注意 靜態資料區的內存在程式結束後由作業系統釋放。堆區 heap area 一般由程式設計師分配和釋放,若...
C語言學習筆記 動態記憶體分配
1 c 語言中的一切操作都是基於記憶體的。2 變數和陣列都是記憶體的別名。記憶體分配由編譯器在編譯期間決定 定義陣列的時候必須指定陣列長度 陣列長度是在編譯期就必須確定的 3 但是程式執行的過程中,可能需要使用一些額外的記憶體空間 1 malloc 和 free 用於執行動態記憶體分配的釋放 2 m...
C語言動態記憶體管理
1 概述 動態儲存管理的基本問題是 系統如何按請求分配記憶體,如何 記憶體再利用。提出請求的使用者可能是系統的乙個作業,也可能是程式中的乙個變數。空閒塊 未曾分配的位址連續的記憶體區稱為 空閒塊 占用塊 已分配給使用者使用的位址連續的記憶體區稱為 占用塊 系統剛剛啟動時,整個記憶體可看做乙個大的 空...