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的地址段,虽然长度一样,不过系统可不接受。
- C语言中动态分配数组指针的释放问题
- C语言 二维数组(指针)动态分配和释放
- C语言 二维数组(指针)动态分配和释放
- C语言 二维数组(指针)动态分配和释放
- C语言 二维数组(指针)动态分配和释放
- C语言 二维数组(指针)动态分配和释放
- c语言中内存的动态分配与释放(多维动态数组构建)
- c语言中内存的动态分配与释放(多维动态数组构建)
- c语言中内存的动态分配与释放(多维动态数组构建)
- 【转】c语言中内存的动态分配与释放(多维动态数组构建)
- C语言中内存的动态分配与释放(多维动态数组构建)
- c语言中内存的动态分配与释放(多维动态数组构建)
- c语言中内存的动态分配与释放(多维动态数组构建)
- c语言中内存的动态分配与释放(多维动态数组构建)
- c语言中内存的动态分配与释放(多维动态数组构建)
- c语言中内存的动态分配与释放(多维动态数组构建)
- C语言 二维数组动态分配和释放
- C语言 二维数组动态分配和释放
- ios编程--AVCapture编程理解
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
- MySQL binlog_format (Mixed,Statement,Row)[转]
- String cannot be resolved to a type
- ajax与jQuery的异步提交,他在什么情况下会走error
- C语言中动态分配数组指针的释放问题
- C++ 函数的重载,覆盖及隐藏解析
- ETL概述
- 正则表达式实现中文的大写字符
- Redis多库选择单例类
- nexus在公司域环境配置私库代理配置
- 搭建GIT服务器
- UIBezierPath 的使用介绍
- 简洁好用的Geek Unіnstaller