C语言中动态分配数组指针的释放问题

http://hi.baidu.com/piaoliuxing126/item/bbf8a324fa4d5153c28d5904

我们都知道要实现根据程序的需要动态分配存储空间,在C中需要使用到stdlib.h中的两个函数,malloc,free,两个函数的介绍如下:

malloc函数的原型为:

void *malloc (u igned int size)
其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。
void free(void *p)
作用是释放指针p所指向的内存区。

其参数p必须是先前调用malloc函数或calloc函数(另一个动态分配存储区域的函数)时返回的指针。给free函数传递其它的值很可能造成死机或其它灾难性的后果。

对于一般变量的动态分配和释放比较简单,这里不介绍,我主要想介绍一下动态分配数组,在free的时候需要注意的事项。

要记住一句话,“在free时,重要的是指针的值,而不是用来申请动态内存的指针本身”。

比如下面的程序段:

int *p = NULL;//声明一个指向Int型的指针,这里用来接收malloc返回的地址空间的首地址

p = (int *)malloc(sizeof(int) * 10);//动态分配10个int型大小的地址段,并将首地址存入p

...下面的这些语句省略,这些语句将p指向了刚刚分配的地址段的中间,比如说指向了p+5;

free(p);//该语句有可能导致死机或者严重的后果,为什么呢?

这其实就是因为,刚刚我们强调的那句话,malloc和free是对应的,他们的这种对应体现在地址段上面,也就是地址的值上面,并不体现在指针变量上。从表面看,这段程序是正确的,其实不然。

那么,如何改正呢?

有两种方法:第一种方法:

在p = (int *)malloc(sizeof(int) * 10);//动态分配10个int型大小的地址段,并将首地址存入p

后面,用另外一个指针变量保存p的值,然后在free的时候,将该指针变量作为参数传入。

第二种方法:

在free(p);这个语句之前,先把p重新指向分配的空间的首地址。

其中第一种方法比较容易理解和使用。

道理其实就是系统给你分配2000到8000的地址段,那么你也要还给系统2000到8000的地址段,而不能还给系统3000到9000的地址段,虽然长度一样,不过系统可不接受。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值