realloc用法
realloc 函数原型:
c
void *realloc(void *ptr, size_t new_size);
realloc 的三种工作方式:
1. 原地扩容(最佳情况)
c
int *arr = malloc(100); // 分配100字节 int *new_arr = realloc(arr, 200); // 扩展到200字节 // 如果new_arr == arr,说明在原地扩展成功
条件:原内存块后面有足够的空闲空间
效果:直接扩展,数据保持原位,性能最好
数据:全部保留在原位置
2. 异地搬迁(常见情况)
c
int *arr = malloc(100); int *new_arr = realloc(arr, 200); // 如果new_arr != arr,说明搬到了新地址
条件:原内存块后面空间不足
过程:
在别处分配新的更大内存块
把原数据完整复制到新位置
自动释放原内存块
数据:全部复制到新位置,保持完整
3. 分配失败
c
int *arr = malloc(100);
int *new_arr = realloc(arr, VERY_LARGE_SIZE);
if (new_arr == NULL) {// 扩容失败,但arr仍然有效!// 需要手动管理原内存
}条件:内存不足,无法分配新空间
效果:返回NULL,原内存块保持不变
数据:全部保留在原位置
重要特性总结:
| 情况 | 返回值 | 原指针 | 原数据 | 需要手动free原指针? |
|---|---|---|---|---|
| 原地扩容 | 新地址=原地址 | 失效 | 保持原位 | 不需要 |
| 异地搬迁 | 新地址≠原地址 | 失效 | 复制到新位置 | 不需要 |
| 分配失败 | NULL | 仍然有效 | 保持原位 | 需要 |
正确用法示例:
c
int *arr = malloc(10 * sizeof(int));
// ... 使用arr// 扩容
int *new_arr = realloc(arr, 20 * sizeof(int));
if (new_arr == NULL) {// 扩容失败,但arr还能用free(arr); // 如果不需要原数据return ERROR;
} else {arr = new_arr; // 更新指针// 不需要free原arr,realloc已自动处理
}