天天看點

malloc、calloc、realloc、alloca幾個記憶體配置設定函數的差別

四個個函數的聲明分别是:

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.

繼續閱讀