四個個函數的聲明分别是:
void* realloc(void* ptr, unsigned newsize);
void* malloc(unsigned size);
void* calloc(size_t nelem, size_t elsize);
void *alloca (size_t __size); //從棧中申請空間
它們的傳回值都是請求系統配置設定的位址,如果請求失敗就傳回NULL
malloc用于申請一段新的位址,參數size為需要記憶體空間的長度,如:
char* p;
p=(char*)malloc(20);
malloc函數并未完成對指針p指向的記憶體的初始化工作。
calloc與malloc相似,參數elsize 為申請位址的機關元素長度,nelem為元素個數,如:
char* p;
p=(char*)calloc(20, sizeof(char));
這個例子與上一個效果相同,但是同時完成了對p所指向記憶體的預設初始化工作,将其中值初始化為預設值。
realloc是給一個已經配置設定了位址的指針重新配置設定空間,參數ptr為原有的空間位址,newsize是重新申請的位址長度
alloca()函數用來在棧中配置設定size個位元組的記憶體空間,是以函數傳回時會自動釋放掉空間。alloca函數定義及庫頭檔案如下:
extern void *alloca (size_t __size) __THROW; //從棧中申請空間
傳回值:若配置設定成功傳回指針,失敗則傳回NULL.
它與malloc()函數的差別主要在于:
alloca是向棧申請記憶體,無需釋放,malloc申請的記憶體位于堆中,最終需要函數free來釋放。
malloc函數并沒有初始化申請的記憶體空間,是以調用malloc()函數之後,還需調用函數memset初始化這部分記憶體空間;alloca則将初始化這部分記憶體空間為0.