LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: Illidan

关于free的两个奇怪的现象

[复制链接]
发表于 2005-9-15 20:55:03 | 显示全部楼层
Post by Illidan
也许是我没有把问题说明白。
出错是必然的,问题的出错的类型。比如第一个程序,只是加了一句无关紧要的int flag;声明,出错的种类就不同了!这个问题回帖的几位谁都没有提及。

可以去看看glibc的源代码中free是如何实现的。
回复 支持 反对

使用道具 举报

发表于 2005-9-15 21:49:13 | 显示全部楼层
不过讨论这个问题意义实在不大,我的机器上第三个也是segfault
所以一开始只是瞟了一眼
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-19 15:20:37 | 显示全部楼层
Post by rickxbx
我提及了哦,只是比较含蓄而已,
int flag;声明看似无关,其实,如果你明白了malloc/free的原理以后,就会明白事实上并非无关.int flag;表示了在栈里面的四字节空间.说到底,把我给你的链接文章看完后就会明白了

我读了些帖子,不过还是不明白,为什么栈里增加4个字节会影响free。请版主明示
回复 支持 反对

使用道具 举报

发表于 2005-9-19 16:11:11 | 显示全部楼层
Post by Illidan
我读了些帖子,不过还是不明白,为什么栈里增加4个字节会影响free。请版主明示

那你应该明白了,malloc的时候,事实上得到的内存是大于我们请求的大小的,而在返回给用户的指针前面有两个int是控制所用,当free的时候,会使用到那两个int里面的数据,栈里面增加4个字节,那么在指针前面的数据就会不一样,比如本来有可能有一个int是ebp,如果增加了4字节后,就不是ebp了,而是那个局部变量的值,虽然这两者都不是正确的信息,但是因为里面的数据不同,却会产生不一样的效果.具体要知道为什么会有那样的效果,比如是段错误还是指针错,要结合自己程序的汇编码和所使用的c库的实现来看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表