Menu
CoddyTech

使用 free() 释放内存

本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 35 课,共 63 课。

使用 malloc() 动态分配内存时,这些内存会一直处于已分配状态,直到你明确释放它们。使用完动态分配的内存后,你可以通过 free() 函数将其归还给系统。

free() 函数接受一个参数:指向你想要释放的内存块的指针。这个指针必须与 malloc()(或 calloc() 等相关函数)返回的指针相同。

#include <stdlib.h>

int *ptr = (int*)malloc(sizeof(int));  // 分配内存
*ptr = 42;  // 使用这块内存
free(ptr);  // 用完后释放内存

没有调用 free() 会导致所谓的内存泄漏。即使你不再使用已分配的内存,你的程序仍会占用它。在长时间运行的程序中,或者在反复分配内存的程序中,这些泄漏可能会耗尽系统的所有可用内存,导致性能问题或崩溃。

记住:每次调用 malloc(),都应该对应一次 free()。在 C 编程中,这种配对对于妥善管理内存至关重要。

challenge icon

挑战

简单

编写一个 C 程序,演示动态内存分配和释放的完整生命周期。程序应执行以下操作:

  1. 从用户处读取一个整数 count,表示要存储多少个整数
  2. 使用 malloc() 和 sizeof(),为包含 count 个整数的数组动态分配内存
  3. 检查内存分配是否成功。如果失败,则打印 Memory allocation failed! 并终止程序
  4. 如果分配成功,则打印 Memory allocated successfully!
  5. 从用户处读取 count 个整数值,并将它们存储在已分配的数组中
  6. 计算并打印所有值的总和,格式为:Sum: [value]
  7. 找到并打印最大值,格式为:Maximum: [value]
  8. 使用 free() 释放内存
  9. 打印 Memory freed successfully!,以确认已完成清理

请记得包含 <stdlib.h> 头文件,以便使用 malloc() 和 free()。这个挑战展示了配对使用 malloc() 和 free() 的重要性,这样可以避免程序中的内存泄漏。

例如,如果输入是:

4
15 8 23 12

输出应为:

Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!

这个挑战强化了一个重要概念:不再需要时,必须正确释放每一块动态分配的内存,从而在 C 编程中完成负责任的内存管理周期。

亲手试试

#include <stdio.h>
#include <stdlib.h>

int main() {
    int count;
    
    // 读取要存储的整数个数
    scanf("%d", &count);
    
    // TODO:在下方编写你的代码
    // 1. 使用 malloc() 和 sizeof() 分配内存
    // 2. 检查内存是否分配成功
    // 3. 读取并存储整数值
    // 4. 计算总和并找出最大值
    // 5. 释放已分配的内存
    
    return 0;
}
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: C 在线编译器