天天看點

C語言-malloc、calloc、realloc及free函數malloc、calloc、realloc 及 free 函數

malloc、calloc、realloc 及 free 函數

malloc

函數原型

  • malloc

    的傳回值進行判空是非常有必要的。

free

函數原型

free

的參數必須要麼是

NULL

,要麼是一個先前從

malloc

calloc

realloc

傳回的值。向

free

傳遞一個

NULL

參數不會産生任何後果。

calloc

函數原型

calloc

malloc

的差別:

  • calloc

    在傳回指向記憶體的指針之前把它初始化為
  • calloc

    的參數包括所需元素的數量和每個元素的位元組數

realloc

函數原型

  • realloc

    函數用于修改一個原先已經配置設定的記憶體塊的大小。使用這個函數,你可以使一塊記憶體擴大或者縮小。如果它用于擴大一個記憶體塊,那麼這塊記憶體原先的内容依然保留,新增加的記憶體添加到原先記憶體塊的後面,新記憶體并未以任何方式進行初始化。如果它用于縮小一個記憶體塊,該記憶體尾部的部分記憶體便被拿掉,剩餘部分記憶體的原先内容依然保留。
  • 如果原先的記憶體塊無法改變大小,

    realloc

    将配置設定另一塊正确大小的記憶體,并把原先那塊記憶體的内容複制到新的塊上。是以,在使用

    realloc

    之後,你就不能再使用指向舊記憶體塊的指針,而是應該改用

    realloc

    所傳回的新指針。
  • 如果

    realloc

    的第一個參數為

    NULL

    ,那麼它的行為就和

    malloc

    一模一樣。

使用動态配置設定記憶體

int *pi;
pi = malloc(100);
if(pi == NULL) 
{
    printf("malloc failed\r\n");
    exit(-1);
}
           

常見的動态記憶體錯誤

  • NULL

    指針進行解引用
  • 對配置設定的記憶體進行操作時越過邊界
  • 釋放并非動态配置設定的記憶體
  • 釋放一塊動态配置設定的記憶體的一部分(free(ptr + 4))
  • 動态記憶體被釋放時候繼續使用

記憶體洩露

當動态配置設定的記憶體不再需要使用時,它應該被釋放,這樣它以後可以被重新配置設定使用。配置設定記憶體但在使用完畢後不釋放将引起

記憶體洩露

總結

  • 檢查從

    malloc

    函數傳回的指針是否為

    NULL

  • 不要通路動态配置設定記憶體之外的記憶體
  • 不要向

    free

    傳遞一個并非由

    malloc

    函數傳回的指針
  • 在釋放動态記憶體之後不要再通路它
  • 使用

    sizeof

    計算資料類型的長度,提高程式的可移植性

繼續閱讀