一、为什么要用动态内存
普通数组固定大小 ,不能随时扩容、缩小;动态内存可以程序运行时 手动申请 / 释放 堆区内存,大小灵活。
二、四个函数头文件
c
运行
#include <stdlib.h>
1. malloc 申请未初始化内存
作用
在堆上申请指定字节数内存 ,不初始化,里面是随机垃圾值。
语法
c
运行
void *malloc(size_t size);
示例
c
运行
// 申请能存5个int的内存
int *p = (int *)malloc(5 * sizeof(int));
- 申请成功:返回起始地址
- 申请失败:返回 NULL
2. calloc 申请并初始化为 0
作用
申请内存,自动全部初始化为 0。
语法
c
运行
void *calloc(size_t num, size_t size);
num:元素个数size:每个元素字节大小
示例
c
运行
int *p = (int *)calloc(5, sizeof(int));
直接 5 个 int 全部初始化为 0,不用手动清零。
3. realloc 重新调整内存大小
作用
给已有的动态内存扩容 或 缩容。
语法
c
运行
void *realloc(void *ptr, size_t newSize);
示例
c
运行
// 原来5个int,扩容到10个
p = (int *)realloc(p, 10 * sizeof(int));
- 会保留原来数据
- 若原位置不够,会换新地址拷贝数据,释放旧内存
4. free 释放动态内存
作用
把堆上申请的内存归还系统,防止内存泄漏。
语法
c
运行
void free(void *ptr);
示例
c
运行
free(p);
p = NULL; // 防止野指针
用完必须 free,否则一直占用内存。
三、四大函数区别一眼看懂
表格
| 函数 | 作用 | 是否初始化 | 参数特点 |
|---|---|---|---|
| malloc | 申请堆内存 | 随机值,不初始化 | 只传总字节数 |
| calloc | 申请堆内存 | 自动初始化为 0 | 个数 + 单个大小 |
| realloc | 调整已有内存大小 | 保留原数据 | 原指针 + 新大小 |
| free | 释放动态内存 | --- | 只传指针 |