malloc、calloc、realloc的使用和區(qū)別

  • 這三個函數(shù)的作用都是用來分配一塊連續(xù)的內(nèi)存空間以供使用,使用過一定要調(diào)用free函數(shù)釋放內(nèi)存,否則會造成內(nèi)存泄漏。

一、 malloc

1.函數(shù)原型

void *malloc(size_t size);

2.功能

??malloc()在內(nèi)存的動態(tài)存儲區(qū)中分配一塊長度為size字節(jié)的連續(xù)區(qū)域。參數(shù)size為需要的內(nèi)存空間的長度,返回該區(qū)域的地址。

3.使用
    int num = 20;
    Class *allClass = NULL;
    allClass = (__unsafe_unretained Class *)malloc(sizeof(Class) * num);
    free(allClass);

二、calloc

1.函數(shù)原型

void *calloc(size_t nmemb, size_t size);

2.功能

??calloc()與malloc()相似,參數(shù)size為申請地址的單位元素長度,nmemb為參數(shù)個數(shù)。

3.使用
    int num = 20;
    Class *allClass = NULL;
    allClass = (__unsafe_unretained Class *)calloc(num, sizeof(Class));
    free(allClass);

三、realloc

1.函數(shù)原型

void *realloc(void *ptr, size_t size);

2.功能

??realloc()是給一個已經(jīng)分配了地址的指針重新分配空間,參數(shù)ptr為原有的空間地址,newsize是重新申請的地址空間。

3.使用
    int num = 20;
    Class *allClass = NULL;
    allClass = (__unsafe_unretained Class *)realloc(allClass, sizeof(Class) * num);
    free(allClass);

四、區(qū)別

  • malloc就是簡單的分配內(nèi)存空間,如果當(dāng)初這塊內(nèi)存被分配過,可能會遺留臟數(shù)據(jù)。
  • calloc會在分配內(nèi)存的時候?qū)?nèi)存初始化清零。
  • realloc是對給定指針指向的內(nèi)存空間進(jìn)行擴(kuò)大縮小,當(dāng)擴(kuò)大一塊內(nèi)存空間時,realloc試圖直接從現(xiàn)存的數(shù)據(jù)后面的那些字節(jié)中獲得附加的字節(jié)。如果后面的字節(jié)不夠,那么就使用堆上第一個足夠滿足要求的自由空間塊,現(xiàn)存的數(shù)據(jù)然后就被拷貝到新的位置上,而老塊則放回堆空間,所以相關(guān)數(shù)據(jù)有被移動位置的可能??s小內(nèi)存時,超出內(nèi)存的數(shù)據(jù)將被丟棄。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容