4. 分配内存的函数
除了malloc之外,C 标准库还提供了另外两个在堆空间分配内存的函数,它们分配的内存同样由free释放。
c
#include <stdlib.h>
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
// 返回值:成功返回所分配内存空间的首地址,出错返回 NULLcalloc的参数很像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)。
c
#include <alloca.h>
void *alloca(size_t size);
// 返回值:返回所分配内存空间的首地址,如果 size 太大导致栈空间耗尽,结果是未定义的参数size是请求分配的字节数,alloca函数不是在堆上分配空间,而是在调用者函数的栈帧上分配空间,类似于 C99 的变长数组,当调用者函数返回时自动释放栈帧,所以不需要free。这个函数不属于 C 标准库,而是在 POSIX 标准中定义的。