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

来源:互联网 发布:java 教程哪个好 编辑:程序博客网 时间:2024/05/01 07:07

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的地址段,虽然长度一样,不过系统可不接受。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 锅的铆钉老是松怎么办 文胸不知道怎么染色了怎么办 未后的信息我该怎么办? 做leep手术后大出血怎么办 眼线笔出不了水怎么办 手机字体变成空心字怎么办 平安树树枝黑了怎么办 柳树被虫钻洞了怎么办 柳树叶子上有虫子怎么办 小金鱼翻肚皮了怎么办 秋天树叶没了小鸟怎么办 去国外旅游不会英语怎么办 橡皮树长了2米高怎么办 榕树盆景长的高怎么办? 2岁宝宝看书弯腰低头怎么办 excel表格打开很慢怎么办 3d模型有红线框怎么办 电视页面加载时错误怎么办 投屏显示加载视频错误怎么办 word遇到问题需要关闭怎么办 画眼线看不出来怎么办 14岁眼皮很松怎么办啊 ps存不了psd格式怎么办 花草上有白色物怎么办 ps抠出来有白边头发怎么办 脸上结痂掉了有红印怎么办 海棠花瓣干枯怎么办茎变软 微信上的图片打不开怎么办 口红吊兰老掉叶子怎么办 翠叶竹芋叶子卷怎么办 牙有龋齿垫底以后酸怎么办 事业单位辞职请示30天不批怎么办 孕早期吃了油菜怎么办 实体店买到翻新苹果手机怎么办 太阳花叶子蔫了怎么办 刚摘下来的多肉怎么办 购车4s不给合同怎么办 橙光游戏2.0商城怎么办 飞羽花卷叶了怎么办 孔雀竹芋叶子发黄卷曲怎么办 孔雀竹芋叶子黄了卷了怎么办