这段代码是否有问题?出现非法访问提示

ViewerP 2014-08-28 07:10:06
while(current != NULL)

{

free(current);

current = current->next;

}

current是一个结构体指针,成员next是一个指向结构体的指针,使用时是指向自身的
在释放内存时,free()已经释放了current指向的内存区域,那么下面的赋值语句还能正确获得下一个结构体的地址吗?
...全文
229 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ViewerP 2014-08-29
  • 打赏
  • 举报
回复
引用 1 楼 Idle_ 的回复:
理论上不能,实践中有可能 -- 主要看你的free是否会引起下层堆管理器释放内存页还给操作系统。
引用 2 楼 brookmill 的回复:
这个和返回局部变量指针的性质差不多,属于错误代码,虽然有个别情况能运行正确。 while(current != NULL) { tmp = current->next; free(current); current = tmp; }
引用 4 楼 lixiaobing3000 的回复:
对current执行free操作后,之前current指向的内存已经被收回,不能再访问,而current->next是属于这块内存的一部分,所以不能访问。
引用 7 楼 shenimenyilian 的回复:
使用一个临时变量先保存current->next 然后再释放current 你这样的结果是未定义的
ok,问题已经解决,散分
Sup_赖佳 2014-08-29
  • 打赏
  • 举报
回复
你都free掉了current指针,还去用current->next; 会报错的 应该像#2 说的那样,才是正确的
N0bug 2014-08-29
  • 打赏
  • 举报
回复
使用一个临时变量先保存current->next 然后再释放current 你这样的结果是未定义的
默伊清风 2014-08-28
  • 打赏
  • 举报
回复
引用 3 楼 zxh707wk 的回复:
[quote=引用 2 楼 brookmill 的回复:] 这个和返回局部变量指针的性质差不多,属于错误代码,虽然有个别情况能运行正确。 while(current != NULL) { tmp = current->next; free(current); current = tmp; }
+1[/quote]
mujiok2003 2014-08-28
  • 打赏
  • 举报
回复
不要期望这代码有确定结果。
lixiaobing3000 2014-08-28
  • 打赏
  • 举报
回复
对current执行free操作后,之前current指向的内存已经被收回,不能再访问,而current->next是属于这块内存的一部分,所以不能访问。
707wk 2014-08-28
  • 打赏
  • 举报
回复
引用 2 楼 brookmill 的回复:
这个和返回局部变量指针的性质差不多,属于错误代码,虽然有个别情况能运行正确。 while(current != NULL) { tmp = current->next; free(current); current = tmp; }
+1
brookmill 2014-08-28
  • 打赏
  • 举报
回复
这个和返回局部变量指针的性质差不多,属于错误代码,虽然有个别情况能运行正确。 while(current != NULL) { tmp = current->next; free(current); current = tmp; }
阿呆_ 2014-08-28
  • 打赏
  • 举报
回复
理论上不能,实践中有可能 -- 主要看你的free是否会引起下层堆管理器释放内存页还给操作系统。

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧