Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 标准中定义的。