4. 分配內存的函數

除了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並不負責把分配的內存空間清零。

有時候用malloccalloc分配的內存空間使用了一段時間之後需要改變它的大小,一種辦法是調用malloc分配一塊新的內存空間,把原內存空間中的數據拷到新的內存空間,然後調用free釋放原內存空間。使用realloc函數簡化了這些步驟,把原內存空間的指針ptr傳給realloc,通過參數size指定新的大小(位元組數),realloc返回新內存空間的首地址,並釋放原內存空間。新內存空間中的數據儘量和原來保持一致,如果size比原來小,則前size個位元組不變,後面的數據被截斷,如果size比原來大,則原來的數據全部保留,後面長出來的一塊內存空間未初始化(realloc不負責清零)。注意,參數ptr要麼是NULL,要麼必須是先前調用malloccallocrealloc返回的指針,不能把任意指針傳給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標準中定義的。