使用 calloc() 分配内存
本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 36 课,共 63 课。
虽然 malloc() 是最常用的动态内存分配函数,但 C 还提供了另一个实用的选择:calloc()。calloc() 函数的名称是“contiguous allocation”(连续分配)的缩写,它为数组分配内存提供了一种方便的方法,还有一项重要的额外优势。
与只接受一个参数(总字节数)的 malloc() 不同,calloc() 接受两个参数:你要分配的元素数量以及每个元素的大小。这使得它在处理数组时特别直观。例如:
#include <stdlib.h>
// 使用 calloc() 为 5 个整数分配空间
int *arr = (int*)calloc(5, sizeof(int));
// 这等价于:malloc(5 * sizeof(int))calloc() 的主要优势是它会自动将所有分配的内存初始化为零。使用 malloc() 时,分配的内存中会包含之前存储在那里的任意值,而 calloc() 则能保证每个字节都设置为零。这意味着所有整数都将为 0,所有浮点数都将为 0.0,所有指针都将为 NULL。
和 malloc() 一样,calloc() 会返回指向已分配内存的指针;如果分配失败,则返回 NULL。因此,你应该始终检查分配是否失败,并记得在用完内存后调用 free() 释放它。
挑战
简单编写一个 C 程序,演示如何使用 calloc() 动态分配内存并自动将其初始化为零。程序应当:
- 从用户处读取一个整数
size,表示要分配的整数数量 - 使用
calloc()为一个包含size个整数的数组动态分配内存 - 检查内存分配是否成功。如果失败,打印
Memory allocation failed!并终止程序 - 如果分配成功,打印
Memory allocated and initialized to zero! - 打印数组中的所有初始值,以展示它们都是零,格式为:
Initial values: [value1] [value2] [value3] ... - 从用户处读取
size个整数值,并将它们存储到已分配的数组中 - 按照以下格式打印所有更新后的值:
Updated values: [value1] [value2] [value3] ... - 计算所有值的总和,并按照以下格式打印:
Sum: [value] - 使用
free()释放内存 - 打印
Memory freed!,确认已完成清理
记得包含 <stdlib.h> 头文件,以便使用 calloc() 和 free()。这个挑战展示了 calloc() 相比 malloc() 的主要优势:自动将所有已分配的内存初始化为零。
例如,如果输入是:
3
10 20 30你的输出应为:
Memory allocated and initialized to zero!
Initial values: 0 0 0
Updated values: 10 20 30
Sum: 60
Memory freed!这个挑战说明了 calloc() 如何为动态分配的数组提供干净、可预测的初始状态,避免 malloc() 可能留下不可预测的垃圾值。
亲手试试
#include <stdio.h>
#include <stdlib.h>
int main() {
int size;
// 读取数组的大小
scanf("%d", &size);
// TODO: 在下方编写你的代码
// 使用 calloc() 为数组分配内存
// 检查内存是否分配成功
// 打印初始值(应为零)
// 读取并存储输入的值
// 打印更新后的值
// 计算并打印总和
// 释放已分配的内存
return 0;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: C 在线编译器