除了malloc
之外,C標準庫還提供了另外兩個在堆空間分配內存的函數,它們分配的內存同樣由free
釋放。
#include <stdlib.h> void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size); 返回值:成功返回所分配內存空間的首地址,出錯返回NULL
calloc
的參數很像fread
/fwrite
的參數,分配nmemb
個元素的內存空間,每個元素占size
位元組,並且calloc
負責把這塊內存空間用位元組0填充,而malloc
並不負責把分配的內存空間清零。
有時候用malloc
或calloc
分配的內存空間使用了一段時間之後需要改變它的大小,一種辦法是調用malloc
分配一塊新的內存空間,把原內存空間中的數據拷到新的內存空間,然後調用free
釋放原內存空間。使用realloc
函數簡化了這些步驟,把原內存空間的指針ptr
傳給realloc
,通過參數size
指定新的大小(位元組數),realloc
返回新內存空間的首地址,並釋放原內存空間。新內存空間中的數據儘量和原來保持一致,如果size
比原來小,則前size
個位元組不變,後面的數據被截斷,如果size
比原來大,則原來的數據全部保留,後面長出來的一塊內存空間未初始化(realloc
不負責清零)。注意,參數ptr
要麼是NULL
,要麼必須是先前調用malloc
、calloc
或realloc
返回的指針,不能把任意指針傳給realloc
要求重新分配內存空間。作為兩個特例,如果調用realloc(NULL, size)
,則相當於調用malloc(size)
,如果調用realloc(ptr, 0)
,ptr
不是NULL
,則相當於調用free(ptr)
。
#include <alloca.h> void *alloca(size_t size); 返回值:返回所分配內存空間的首地址,如果size太大導致棧空間耗盡,結果是未定義的
參數size
是請求分配的位元組數,alloca
函數不是在堆上分配空間,而是在調用者函數的棧幀上分配空間,類似於C99的變長數組,當調用者函數返回時自動釋放棧幀,所以不需要free
。這個函數不屬於C標準庫,而是在POSIX標準中定義的。