使用 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 编程中,这种配对对于妥善管理内存至关重要。
挑战
简单编写一个 C 程序,演示动态内存分配和释放的完整生命周期。程序应执行以下操作:
- 从用户处读取一个整数
count,表示要存储多少个整数 - 使用
malloc()和sizeof(),为包含count个整数的数组动态分配内存 - 检查内存分配是否成功。如果失败,则打印
Memory allocation failed!并终止程序 - 如果分配成功,则打印
Memory allocated successfully! - 从用户处读取
count个整数值,并将它们存储在已分配的数组中 - 计算并打印所有值的总和,格式为:
Sum: [value] - 找到并打印最大值,格式为:
Maximum: [value] - 使用
free()释放内存 - 打印
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;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: C 在线编译器