malloc、calloc、realloc
特性 | malloc | calloc | realloc |
---|---|---|---|
参数 | 总字节数 size | 元素个数 nmemb + 单个元素大小 size | 原内存指针 ptr + 新大小 size |
初始化 | 不初始化,内存内容为随机值 | 自动初始化为 0 | 不改变原有数据(新扩展部分为随机值) |
典型用途 | 分配无需初始化的内存(如临时缓冲区) | 分配需初始为 0 的数组 / 结构体 | 动态调整内存大小(如数组扩容、收缩) |
返回值 | 新内存指针(失败返回 NULL ) | 新内存指针(失败返回 NULL ) | 调整后的内存指针(失败返回 NULL ,原内存不变) |
3. 示例对比
(1)基础内存分配
// malloc:分配 10 个 int 的内存(未初始化)
int *arr1 = (int*)malloc(10 * sizeof(int)); //一个传参// calloc:分配 10 个 int 的内存(自动初始化为 0)
int *arr2 = (int*)calloc(10, sizeof(int)); //两个传参
(2)用 realloc
调整内存大小
// 初始分配 10 个 int
int *arr = (int*)malloc(10 * sizeof(int));
if (arr == NULL) { /* 处理错误 */ }// 扩展为 20 个 int(扩容)
int *new_arr = (int*)realloc(arr, 20 * sizeof(int));
if (new_arr == NULL) {// 扩容失败,原内存 arr 仍有效free(arr);return -1;
}
arr = new_arr; // 更新指针到新内存// 使用扩展后的内存...// 收缩为 5 个 int(缩容)
arr = (int*)realloc(arr, 5 * sizeof(int));
realloc
的特殊行为
- 内存移动:若原内存块附近有足够空间,
realloc
会直接扩展当前块;否则会分配新内存块,复制原有数据,并释放旧块(因此新指针可能与原指针不同)。