你观察得很仔细!这里确实存在一个指针管理的问题,让我详细解释一下:
代码分析
int* new_arr = (int*)realloc(arr, 5*sizeof(int));
if(new_arr == NULL) {
// ... 错误处理
}
arr = new_arr; // ✅ 重要!更新指针!
// ... 使用数组
free(arr);
arr = NULL; // arr被置为NULL
// 但 new_arr 没有被置为NULL
问题解答
1. 为什么只有 arr
被赋值了 NULL
?
- 设计意图:程序员只关心继续使用的指针
arr
,确保它不会成为野指针 new_arr
是临时变量,只在realloc
后用于检查是否分配成功- 一旦确认
realloc
成功并将地址赋给arr
,new_arr
的使命就完成了
2. 实际情况
free(arr); // 释放内存块
arr = NULL; // arr现在指向NULL,安全
// new_arr 仍然指向已释放的内存地址(野指针)
// 但由于它是局部变量且不再使用,风险相对较小
3. 更好的做法
free(arr);
arr = NULL;
new_arr = NULL; // 🔥 建议也置为NULL,避免潜在的野指针问题
4. 为什么实践中经常忽略 new_arr = NULL
?
new_arr
是局部变量,函数结束就会自动销毁- 在后续代码中没有再使用
new_arr
- 但严格来说,设置为 NULL 是更安全的编程习惯
总结
你的观察是正确的!虽然在这个特定场景中风险不大(因为函数即将结束),但从代码严谨性角度,确实应该将两个指针都置为 NULL。
内容由零声教学AI助手提供,问题来源于学员提问