在程序的執行期間分配內存時,內存區域中的這個空間稱為堆(heap)。還有另一個內存
區域,稱為堆棧(stack),其中的空間分配給函數的參數和本地變量。在執行完函數后,存儲
參數和本地變量的內存空間就會釋放。堆中的內存是由程序員控制的。
malloc():
int *pNumber = (int*)malloc(100); // 分配100字節內存 int *pNumber = (int*)malloc(25*sizeof(int)); //存儲25個int值得內存
類型轉換(int*)將函數返回的地址轉換成 int 類型的指針。malloc()返回 void 類型的指針,
void* 可以指向任何類型的數據,不能取消對 void 指針的引用,因為它指向未具體說明的對象。
如果因某種原因而不能分配請求的內存,malloc()會返回一個 NULL 指針。
用 if 語句檢查是否分配:
int *pNumber = (int*)malloc(25*sizeof(int)); if (!pNumber) { // 內存分配失敗的處理代碼 }
釋放動態分配的內存:
free(pNumber); pNumber = NULL;
colloc() :
與 malloc() 相比有兩個優點:
(1)它把內存分配為給定大小的數組;
(2)它初始化了所分配的內存,所有位都是 0。
int *pNumber = (int*)calloc(75, sizeof(int)); // 分配了包含75個int元素的數組
如果不能分配所請求的內存,返回值就是 NULL。
可以讓編譯器執行類型轉換:
int *pNumber = calloc(75, sizeof(int));
擴展動態分配的內存 realloc() :
realloc() 函數可以重用或擴展以前用 malloc()或 calloc()(或者realloc())分配的內存。
realloc()的兩個參數:
1)、一個是包含地址的指針,該地址以前由malloc()、colloc()或realloc()返回。
2)、要分配的新內存的字節數。
realloc()函數分配第二個參數指定的內存量,把第一個指針參數引用的、以前分
配的內存內容傳遞到新分配的內存中,傳遞的內容量是新舊內存中區域較小的那一個。
realloc()函數返回一個指向新內存的void*指針,如果分配失敗,返回NULL。如果
第一個參數是NULL,就分配第二個參數指定的新內存,類似malloc()。
realloc()保存了原內存區域的內容,且保存的量是新舊內存區域中較小的那個。
如果新內存區域大於舊內存區域,新增的內存就不會初始化,而是包含垃圾值。
動態分配內存的基本原則 :
* 避免分配大量的小內存塊。分配堆上的內存有一些系統開銷,所以分配許多小的內存塊
比分配幾個大內存塊的系統開銷大。
* 僅在需要時分配內存。只要使用完堆上的內存塊,就釋放它。
* 總是確保釋放以分配的內存。在編寫分配內存的代碼時,就要確定在代碼的什么地方
釋放內存。
* 在釋放內存之前,確保不會無意中覆蓋堆上已分配的內存地址,否則程序就會出現內存
泄漏。在循環中分配內存時,要特別小心。