free内存的时候出错,求助

mikilin123 2016-08-05 05:11:41
int *pi = malloc(sizeof(int));
*pi=100;
*(pi+1)=101;
free( pi ); //出错

请问,这里free的时候,为什么会出错?谢谢
...全文
115 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2016-08-06
  • 打赏
  • 举报
回复
越界访问了 改成 int *pi = malloc(sizeof(int)*2); 可正常
小灸舞 版主 2016-08-06
  • 打赏
  • 举报
回复
你申请了4个字节,实际占用的空间当然是大于4字节的,它需要放内存管理信息,调试信息这些。
不然你free的时候它怎么能知道到底释放多大?
  • 打赏
  • 举报
回复
引用 5 楼 dy452876 的回复:
[quote=引用 1 楼 zjq9931 的回复:] 倒数第2行访问越界了。。。
我在上面回复了,帮忙一起看下。[/quote] 这里有讲。 http://blog.csdn.net/yupei881027/article/details/42673343
mikilin123 2016-08-05
  • 打赏
  • 举报
回复
引用 1 楼 zjq9931 的回复:
倒数第2行访问越界了。。。
我在上面回复了,帮忙一起看下。
mikilin123 2016-08-05
  • 打赏
  • 举报
回复
引用 2 楼 qq423399099 的回复:
int *pi = malloc(sizeof(int));你这个只申请了一个int的字节
*(pi+1)=101;这句会造成越界,破坏了你堆空间周围的信息,导致free出错


虽然是这个意思,按这么说在单步执行*(pi+1)=101的时候报错更合理。

此外,还有个现象,比如把*(pi+1)改成*(pi+2)=101,再释放的时候就没问题了,
有没有可能虽然申请了一个4字节的内存,但是实际上占用的字节不止4个字节?

前4个字节是100,后面那些字节都是什么?
再看free以后的

明显有48个字节发生了变化,被清空了,这是编译器的问题吗?
赵4老师 2016-08-05
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
小灸舞 版主 2016-08-05
  • 打赏
  • 举报
回复
int *pi = malloc(sizeof(int));你这个只申请了一个int的字节
*(pi+1)=101;这句会造成越界,破坏了你堆空间周围的信息,导致free出错
  • 打赏
  • 举报
回复
倒数第2行访问越界了。。。

69,373

社区成员

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

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