malloc不free_研究了多年C语言,却还没有搞懂malloc和free

本文探讨了C语言中malloc和free的使用。通过一个例子展示malloc分配内存后,free释放内存,然后尝试再次写入数据到已释放内存的场景。在不同环境下,这段代码可能有不同的行为,但释放内存后使用可能导致不可预测的结果。理解malloc分配的内存只属于当前调用者,free后内存可被再次分配,并应避免使用free后的内存,以防止意外访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1f0130511bf7ca53bf4744b6ea62a8bf.png

前两天看到一个笔试题,关于malloc和free的,代码很简单,但是很多同学却产生的疑问。

这两个函数在C语言中经常出现,大多数人对他们的认知就是:

malloc申请内存,有了内存就能够使用;

free释放内存,释放了就不能用。

解释的基本上没错。但是有的时候会出现一些很怪异的现象,究其原因,还是没有搞清楚他们的真正用法。直接上代码。

#include #include #include int main(){    char *s = (char *)malloc(sizeof(char) * 16);    memcpy(s, "hello", 6);     free(s);    memcpy(s, "world", 6);     printf("%s\n", s);     return 0;}

代码很简单,先申请一块内存,往内存里面拷贝字符串“hello”,然后释放内存,再往里面拷贝字符串“world”。这个代码按照我们正常的思维逻辑,执行到第二次拷贝的时候,应该就出现了段错误,因为内存已经被释放了,强行往里面写入数据,相当于访问了不能访问的内存,那程序肯定是挂掉了。

于是我在Redhat里面运行了一下。

d36cc2cfe73877db384e0dd3061f4324.png

结果是程序并没有死掉。

接下来我又在Ubuntu里面运行了一下。

e1211be8de7b97dcd9890266ebb66f36.png

这个才是我们想要的结果。于是,很多小伙伴又会发出一句经典的感慨:我的代码刚才还是好好的呀!

其实两个运行结果都没有问题,不同的环境、不同的编译器,处理的结果会不一样。关于malloc和free,应该明白以下几点:

  1. malloc申请的内存,一旦申请成功,就只能为你所用,其他地方的malloc无法申请到这块内存;

  2. free释放内存后,这块内存重获自由,程序其他地方调用malloc,有可能系统会把这块内存分配出去;

  3. free释放内存后,这块内存里面的数据有可能变成垃圾值,有可能还是原来的数值,当然也有可能无法访问。

明白了这几点,我们在写代码的时候就要做到:

  1. free释放掉内存后,应该将指针置为空,避免乱用;

  2. 被free掉的内存不要再去使用它,虽然有时候使用不会报错。

5d0ccc311bbbd43d3815332b52e5ee20.png

f05c1acc619ce225676bf4e86754b52c.png

101129a1de8a0ae4f12a3e1ac087e0f8.png

8851240d9ed1874ade4dea75f27900b1.png

e1f92b49933212685b442831a88312a1.png

150aa08f317de0beb4bf84e67de4e958.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值