(c语言课件)第17节 动态存储空间管理跟链表.pptVIP

(c语言课件)第17节 动态存储空间管理跟链表.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(c语言课件)第17节 动态存储空间管理跟链表

第十七 章动态存储空间管理与链表 一、动态存储分配及常见函数说明 隐式和显式 1. 引例 要处理学生成绩,需要用数组存放。但编程时并不知道运行时需要处理多少学生成绩,每次处理的成绩项数也可能不同。 int n; ... scanf(%d, n); double scores[n]; /* 不行!*/ ... /* 读入数据,然后处理 */ 不能用变量说明scores大小(必须静态确定)。 2. 问题的本质及解决方案 问题的本质 程序运行中需要使用存储,有时程序对存储的需求量在写程序时不能确定。 可能解决方案 1)分析问题,定义适当大小的数组。若分析正确,一般都能处理。但数据很多时程序就不能用。 2)定义尽可能大的数组以满足任何需要。浪费大量存储资源。如有多个这种数组就更难办。系统可能无法容纳几个大数组,但实际上它们并不同时需要很大空间。 解决的办法是“动态存储分配”。在程序运行中做存储分配工作。 3. 动态存储分配 动态存储分配 根据运行中的需要分配存储,取得存储块使用,称为动态存储分配。在运行中根据需要动态进行。 动态存储块具有起始地址,地址可以存储在指针里,因此可以借助于指针保存存储空间地址。 用指针指向存储块,间接使用被指存储。访问动态分配存储是指针的最重要用途。 4. 动态存储释放及存储堆 动态释放 不用的动态存储块应交还系统,动态申请的内存空间必须由程序代码以显式的方式主动释放。 动态分配、释放由动态存储管理系统完成,这是程序运行系统的子系统,管理着称作堆(英文heap)的存储区。 大部分常规语言都有这种机制。 5. C语言的动态存储管理机制 用标准库函数实现 stdlib.h malloc.h 存储分配函数malloc(),原型: void *malloc(size_t n); /*size_t是某整型*/ 功能 分配一块不小于n的存储,返回其地址。无法满足时返回空指针值。 例 int n; double *data; ... scanf(%d, n); data=(double*)malloc(n*sizeof(double)); if (data == NULL) { .... /* 分配未完成时的处理 */ } ..data[i]..*(data+j)../*正常处理*/ malloc说明 malloc使用注意事项: 的返回值(void*)应通过类型强制转为特定指针类型后赋给指针变量。 分配存储块大小应该用sizeof计算 动态分配必须检查成功与否 动态分配的块大小也是确定的。越界使用(尤其是越界赋值)是严重错误,可能导致程序或系统垮台 6. calloc 带计数和清0的存储分配函数calloc,原型: void *calloc(size_t n, size_t size); size是元素大小,n是个数。 分配一块存储,足够存n个大小为size的元素,并把元素全部清0; 无法分配时返回空指针值。前面的存储分配问题也可用下面语句实现 data = (double*)calloc(n, sizeof(double)); 主要差别 malloc对所分配的区域不做任何事情,calloc对整个区域自动清0。 7. 空间释放函数:free 为保证动态存储的有效使用,动态分配块不再用时应释放。动态存储块的释放只能通过调用free完成。Memory leak 函数原型 void free(void *p); 功能 free释放p指的存储块。 注意 该块必须是通过动态存储分配得到的,不要对并非指向动态分配块的指针用本操作 p值为空时什么也不做 执行free(p)后p值未变,被指块可能已变。不允许再间接访问已释放存储块 8. 分配调整函数realloc 函数原型 void *realloc(void *p, size_t n); 功能 更改已有分配。p指原分配块,n是新大小要求。 返回大小至少为n的存储块指针,新块与原块一致: 新块小时保存原块n范围内数据; 新块大时原数据存在,新增部分不初始化。分配成功后原块可能改变。 无法满足时返回空指针,原块不变。 常用写法(防止分配失败导致原存储块丢失) : q = (double*)realloc(p, m * sizeof(double)); if (q == NULL) { /*未成功,p仍指原块,特殊处理*/ } else { p = q; /* 令p指向新块,正常处理 */ ... 二、动态存储空间管理 如果动态申请了许多同类型缓冲区,该如何管理? 方法1:指针数组(地址数组) 设置一段内存空间,例如数组,用来保存存储空间的起始地址。 数组中每个元素用来保存某种类型的存储空间的地址,等于每个元素都是一个指针变量。 int *pnarr[10]; //定义一

文档评论(0)

rachel + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档