calloc 和 realloc
calloc 和 realloc 都是 C 语言中动态内存分配的函数,与 malloc 类似但有所不同:
calloc
用途:分配并初始化内存块为 0
原型:void *calloc(size_t num, size_t size);
功能:分配 num 个元素,每个元素大小为 size 字节,总计 num * size 字节,并将所有字节初始化为 0。
特点:
内存被清零,适合分配数组或结构体
比 malloc 后手动 memset 更方便安全
分配失败返回 NULL
示例:
Apply
// 分配 10 个 int 的数组,初始值全为 0
int *arr = calloc(10, sizeof(int));
// 等效于:
// int *arr = malloc(10 * sizeof(int));
// memset(arr, 0, 10 * sizeof(int));
realloc
用途:调整已分配内存块的大小
原型:void *realloc(void *ptr, size_t new_size);
功能:更改 ptr 指向的内存块大小为 new_size 字节。
特点:
如果 ptr 为 NULL:等同于 malloc(new_size)
如果 new_size 为 0 且 ptr 非 NULL:等同于 free(ptr),返回 NULL
其他情况:尝试在原位置扩展/缩小,否则分配新内存并拷贝数据
返回新指针(可能与原指针不同)
示例:
Apply
int *arr = malloc(5 * sizeof(int)); // 分配 5 个 int
// 需要扩展为 10 个 int
int *new_arr = realloc(arr, 10 * sizeof(int));
if (new_arr) {
arr = new_arr; // 使用新指针
} else {
// 分配失败,原内存仍有效
free(arr);
}
关键区别:
函数 主要用途 初始化 典型使用场景
malloc 分配未初始化内存 不初始化 通用内存分配
calloc 分配并清零内存 所有位设为 0 数组、结构体,需要初始零值
realloc 调整已分配内存大小 保持原数据,新增部分未初始化 动态数组大小调整

浙公网安备 33010602011771号