ZBLOG

我是说在这段代码中 #include #include int main() { int*arr=(int*)malloc(3*sizeof(int));//先分配3个整数 if(arr==NULL)return 1; arr[0]=1;arr[1]=2;arr[2]=3; printf("Original array:"); for(int i=0;i

你观察得很仔细!这里确实存在一个指针管理的问题,让我详细解释一下:

代码分析

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 成功并将地址赋给 arrnew_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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24366

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?