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