内存管理
概念说明
C 语言允许程序员主动向堆区申请和释放内存。 这让程序能处理运行时才知道大小的数据,但也意味着你要自己负责释放资源和避免非法访问。
学动态内存时,光记住函数名远远不够。 更重要的是建立“资源所有权”的意识:是谁申请的、谁负责释放、失败时怎么兜底、释放后还能不能继续使用旧地址。
还可以先区分两类常见内存:
- 自动存储区:例如普通局部变量,通常跟随作用域自动创建和销毁。
- 堆区:通过
malloc这类接口显式申请,必须手动释放。
语法/规则
malloc(size)按字节申请一块未初始化的内存。calloc(count, size)会申请并清零一块内存。realloc(ptr, new_size)用于调整原内存块大小,可能返回新地址。free(ptr)释放动态内存;释放后不应再继续使用该地址。- 申请内存后必须先检查返回值是否为
NULL。 - 调整内存大小时,最好先用临时指针接收
realloc返回值,避免原指针丢失。 - 动态数组的字节数通常写成
元素个数 * sizeof(元素类型),而不是手写魔法数字。
示例
| |
输出结果:
| |
常见错误
- 申请了内存却忘记释放,造成内存泄漏。
free之后继续读写同一块内存,形成 use-after-free。- 申请大小写错,例如忘了乘
sizeof(元素类型),导致缓冲区过小。 - 直接把
realloc返回值赋给原指针,失败时把原地址也丢了。 - 对同一块内存重复
free,或者释放了根本不是动态申请得到的地址。