这是一个很好的问题!让我来解释一下内存管理的原理:
关键理解点:
1. realloc
的工作机制
int* new_arr = (int*)realloc(arr, 5*sizeof(int));
- 如果
realloc
成功:- 可能在原有内存块后扩展空间(如果后面有足够连续空间)
- 也可能分配新内存块,复制旧数据,然后释放旧内存块
- 无论哪种情况,旧指针
arr
都不应再使用
2. 为什么不需要 free(new_arr)
?
// 🔴 错误做法(会导致双重释放)
free(new_arr); // 不要这样做!
free(arr); // arr和new_arr指向同一内存
// ✅ 正确做法
arr = new_arr; // 更新指针
// ...使用数组...
free(arr); // 🔥只需释放一次!
3. 内存状态变化:
初始状态:
arr → [1][2][3] (3个整数)
realloc后:
情况1:原地扩展
arr → [1][2][3][?][?] (扩展到5个)
new_arr == arr (相同地址)
情况2:重新分配
arr → [1][2][3] (已自动释放!)
new_arr → [1][2][3][?][?] (新地址)
4. 修正后的完整代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
int* arr = malloc(3 * sizeof(int));
if(arr == NULL) return 1;
arr[0] = 1; arr[1] = 2; arr[2] = 3;
printf("Original array: ");
for(int i = 0; i < 3; i++) printf("%d ", arr[i]);
printf("\n");
// realloc尝试扩展
int* new_arr = realloc(arr, 5 * sizeof(int));
if(new_arr == NULL) {
printf("Reallocation failed! Keeping old block.\n");
free(arr); // 🎯只释放旧内存
return 1;
}
arr = new_arr; // ✅重要:更新指针
//使用扩展后的数组
arr[3] = 4;
arr[4] = 5;
printf("After realloc: ");
for(int i = 0; i < 5; i++) printf("%d ", arr[i]);
free(arr); // 🎯只需释放一次!
return 0;
}
总结规则:
realloc
成功后:只需最终free(新指针)
一次realloc
失败时:需要free(旧指针)
- 永远不要同时释放新旧两个指针
内容由零声教学AI助手提供,问题来源于学员提问