c语言无错误但是无法运行,C语言:free出错导致程序无法正常运行,并且不报错误...

今天遇到这样一个问题:

malloc申请空间,free释放时出错,程序无法正常运行,并且不报错误!

通过下断点找到错误:

4f8e5709b7ec612df9c0b14cca9a223d.png

最终确定在malloc申请空间出错:

pNode pNewNode = (pNode)malloc(sizeof(pNode));

pNode是一个指针,只申请四个字节;

调用时则按照Node节点来进行储存,当free是出现错误!

free的原理:

free()释放的是指针指向的内存!注意!释放的是内存,不是指针!指针并没有被释放,指针仍然指向原来的存储空间。

指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!

只不过现在指针指向的内容的垃圾,是未定义的,

因此,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。

如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,

如果释放两次及两次以上会出现错误

(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。

free()

申请的内存片段会存放着相应信息

(大多数实现所分配的存储空间比所要求的要稍大一些,

额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等)

错误使用时,会不经意修改这个信息,就会导致无法释放内存

我出现的问题是:

申请空间将指针当成了节点,释放时越界,但是系统不会报错,也不给提示警告。

当释放时,系统发现问题,无法进行下去,出现异常终端程序。

由此得来的教训就是,C语言中访问数组一定要注意越界的问题!!!

malloc后free出错总结:

1、malloc与free配套使用。(有申请有释放,有创建有销毁)

2、指向malloc申请的堆内存的指针,在运用过程中千万不要另外赋值,否则同样导致内存泄露

3、malloc后,实际使用时指针长度超过了你申请的范围。再去free时肯定出问题。 (我的错误原因)

4、改变指针的初始指向地址

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值