手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

链表的C语言实现之动态内存分配

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
 一、为什么用动态内存分配

  但我们未学习链表的时候,假如要存储数量比较多的同类型或同结构的数据的时候,总是使用一个数组。比如说我们要存储一个班级学生的某科分数,总是定义一个float型(存在0.5分)数组:

float score[30];

  但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?

  在很多的情况下,您并不能确定要使用多大的数组,比如上例,您可能并不知道该班级的学生的人数,那么您就要把数组定义得足够大。这样,您的程式在运行时就申请了固定大小的您认为足够大的内存空间。即使您知道该班级的学生数,但是假如因为某种特别原因人数有增加或减少,您又必须重新去修改程式,扩大数组的存储范围。这种分配固定大小的内存分配方法称之为静态内存分配。但是这种内存分配的方法存在比较严重的缺陷,特别是处理某些问题时:在大多数情况下会浪费大量的内存空间,在少数情况下,当您定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。

  那么有没有其他的方法来解决这样的外呢体呢?有,那就是动态内存分配。

  所谓动态内存分配就是指在程式执行的过程中动态地分配或回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程式的需要实时分配,且分配的大小就是程式需要的大小。从以上动、静态内存分配比较能够知道动态内存分配相对于景泰内存分配的特点:

  1、无需预先分配存储空间;

  2、分配的空间能够根据程式的需要扩大或缩小。

  二、如何实现动态内存分配及其管理

  要实现根据程式的需要动态分配存储空间,就必须用到以下几个函数

  1、malloc函数

  malloc函数的原型为:

void *malloc (unsigned int size)

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

  下例是个动态分配的程式:

#include
#include
main()
{
 int count,*array; /*count是个计数器,array是个整型指针,也能够理解为指向一个整型数组的首地址*/
 if((array(int *) malloc(10*sizeof(int)))==NULL)
 {
  printf("不能成功分配存储空间。");
  exit(1);
 }
 for (count=0;count〈10;count ) /*给数组赋值*/
  array[count]=count;
 for(count=0;count〈10;count ) /*打印数组元素*/
  printf("-",array[count]);
}

  上例中动态分配了10个整型存储区域,然后进行赋值并打印。例中if((array(int *) malloc(10*sizeof(int)))==NULL)语句能够分为以下几步:

  1)分配10个整型的连续存储空间,并返回一个指向其起始地址的整型指针

  2)把此整型指针地址赋给array

  3)检测返回值是否为NULL

  2、free函数

  由于内存区域总是有限的,不能不限制地分配下去,而且一个程式要尽量节省资源,所以当所分配的内存区域不用时,就要释放他,以便其他的变量或程式使用。这时我们就要用到free函数。

  其函数原型是:

void free(void *p)

  作用是释放指针p所指向的内存区。

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

  注意:这里重要的是指针的值,而不是用来申请动态内存的指针本身。例:

int *p1,*p2;
p1=malloc(10*sizeof(int));
p2=p1;
……
free(p2) /*或free(p2)*/

  malloc返回值赋给p1,又把p1的值赋给p2,所以此时p1,p2都可作为free函数的参数。

  malloc函数是对存储区域进行分配的。

  free函数是释放已不用的内存区域的。

  所以由这两个函数就能够实现对内存区域进行动态分配并进行简单的管理了。




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS