Menu
CoddyTech

使用 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() 释放它。

challenge icon

挑战

简单

编写一个 C 程序,演示如何使用 calloc() 动态分配内存并自动将其初始化为零。程序应当:

  1. 从用户处读取一个整数 size,表示要分配的整数数量
  2. 使用 calloc() 为一个包含 size 个整数的数组动态分配内存
  3. 检查内存分配是否成功。如果失败,打印 Memory allocation failed! 并终止程序
  4. 如果分配成功,打印 Memory allocated and initialized to zero!
  5. 打印数组中的所有初始值,以展示它们都是零,格式为:Initial values: [value1] [value2] [value3] ...
  6. 从用户处读取 size 个整数值,并将它们存储到已分配的数组中
  7. 按照以下格式打印所有更新后的值:Updated values: [value1] [value2] [value3] ...
  8. 计算所有值的总和,并按照以下格式打印:Sum: [value]
  9. 使用 free() 释放内存
  10. 打印 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;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: C 在线编译器