C語言支持動態存儲分配,即在程序執行期間分配內存單元的能力,利用動態存儲分配,可以根據需要設計擴大(或縮小)的數據結構,雖然可以適用於所有類型的數據,但是動態存儲分配更常用於字符串、數組和結構體
本文地址:http://www.cnblogs.com/archimedes/p/c-dynamic-storage-allocation.html,轉載請注明源地址。
1、內存分配函數
3種內存分配函數都是聲明在<stdlib.h>中:
malloc函數不需要對分配的內存快進行清除,所以它比calloc函數更高效
當申請內存塊而調用內存分配函數的時候,函數會返回void*型的值。內存中對象的空間大小,是以“字節”的數目為單位計算的,許多頭文件都定義了size_t類型,專門用來保存這種“內存”空間的相關信息,比如sizeof運算符返回字節的數目,類型是size_t
2、空指針
由於用名NULL的宏來表示空指針,所以常使用下列方式測試malloc函數的返回值:
p=malloc(10000); if(p==NULL) { /*分配失敗*/ }
在C語言中,指針測試真假的方法和數的測試一樣:
if(p==NULL) if(!p) if(p!=NULL) if(p)
舉例如下:
typedef struct { long key; /*...*/ }Record; float *myFunc(size_t n) { double *dptr=malloc(sizeof(double)); if(dptr==NULL) { /*...*/ return NULL: } else { *dptr=0.07; } /*...*/ Record *rptr; if(rptr=malloc(2*sizeof(Record))==NULL) { /*...*/ return NULL; } float *fptr=malloc(n*sizeof(float)); if(fptr==NULL) { /*...*/ return NULL: } /*...*/ return fptr; }
使用malloc函數為數組分配存儲空間,需要使用sizeof運算符來計算每個元素所需要的空間數量
int *a; a=malloc(n * sizeof(int));
calloc函數
calloc函數在<stdlib.h>中具有如下的原型:
void *calloc(size_t nmemb, size_t size);
在分配了內存之後,calloc函數會通過對所有位設置為0的方式進行初始化
a=calloc(n, sizeof(int)) struct point{int x,y;}*p; p=calloc(1,sizeof(struct point));
realloc函數
realloc函數可以調整數組的大小使它更適合需要,realloc函數原型在<stdlib.h>中:
void *realloc(void *ptr, size_t size)
ptr指向的內存塊一定是先前通過malloc函數、calloc函數或realloc函數的調用獲得的,size表示內存塊的新尺寸
C語言標准列出幾條關於realloc函數的規則:
內存分配函數所獲得的內存塊都來自一個稱為堆的存儲池
p=malloc(...) q=malloc(...) p=q;
上面的代碼使得p和q都指向同一塊內存,導致出現內存洩露,使用free函數來釋放不需要的內存,來回收垃圾
free函數在<stdlib.h>中有如下原型:
void free(void *ptr)
以上的代碼改寫如下:
p=malloc(...) q=malloc(...) free(p); p=q;