我认识的malloc和free

我malloc(buffer),我一定要free(buffer)么?这个答案很多人都说是肯定的,今天我就来把它给否定了,因为我以前也是这种思想,malloc什么就 free什么。
先来举个列子:

 
      这下我来分析一下这个程序,如果你去运行这程序,有可能完全没有问题,但是实质上存在问题,只是你运行一遍根本表现不出来。俗话说的好“路遥知马力,日久见人心”。这程序也一样,看上去没有什么问题,你去一遍一遍运行也没有错误,但是如果你要它连续运行N遍,当然对于这个程序来说,这个N也许比较大,如果你比较感兴趣,你可以取N不同的值去看看,结果会怎么样。
      在说出问题之前,我在仔细来说说这个程序,因为这是我认识的比较深刻的。定义一个变量的时候,最好给赋予初值,特别是指针一定要NULL。然后就是memset这个函数很好,它可以使你分配一段内存,重复来使用多遍,当然每次使用前就要是memset把它清空。在来看看,我给buffer,str都分配了10个字节空间,数组a的长度也是10,就有人不明白了,为什么在for语句里面,i<length-1,如果是i<length,会怎么样! i<length-1,使buffer,str都是名符其实的字符串,而i<length,则使buffer,str成不了字符串,因为字符串有个结束标志'/0',如果大家不信,可以自己写程序,来验证,也可以自己拿着笔来数数。
  这下来说,这个程序深含的“炸弹”,你们能发现buffer,和str有什么不一样么?要是你能说出来,我想你就看到了这个“炸弹”。我有个朋友,和我一谈到指针,他就说“指针肯定是一个整数”,GOOD,没错,指针也是一个数。回到程序上来,如果我们一malloc,就来一句printf("buffer:%d/n",buffer);然后给buffer赋值后,我们在来一句printf("buffer:%d/n",buffer);结果一样么?如果你不知道,写程序运行看看。同样,你也可以用printf来看看str的值有没有改变。
  都明白了吧,都知道是怎么回事了吧,不过我还是要说说怎么来纠正着个错误。上面的程序,malloc(str)和free(str)都是完全正确的,但是malloc(buffer)和free(buffer),这样就不对了,因为buffer已经不在是开始分配时候的那个值了。怎么来纠正呢:还定义一个变量char *buf,让它来记录malloc(buffer)时buffer的值,也就是 buf=buffer=(char *)malloc(length * sizeof(char));在后面就free(buf)了,绝对不能free(buffer);
  malloc和free的确是一对,但是,不是malloc(buffer)就一定要free(buffer),而是从哪里malloc的就要从哪里free.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值