- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
7.6动态存储管理.PDF
7.6 动态存储管理
7.6.1 为什么需要动态存储管理
程序中需要用变量(各种简单类型变量、数组变量等)保存被处理的数据和各种状态信
息,变量在使用之前必须安排好存储:放在哪里、占据多少存储单元,等等,这个工作被称
作存储分配。用机器语言写程序时,所有存储分配问题都需要人处理,这个工作琐碎繁杂、
很容易出错。在用高级语言写程序时,人通常不需要考虑存储分配的细节,主要工作由编译
程序在加工程序时自动完成。这也是用高级语言编程序效率较高的一个重要原因。
C 程序里的变量分为几种。外部变量、局部静态变量的存储问题在编译时确定,其存储
空间的实际分配在程序开始执行前完成。程序执行中访问这些变量,就是直接访问与之对应
的固定位置。对于局部自动变量,在执行进入变量定义所在的复合语句时为它们分配存储。
应该看到,这种变量的大小也是静态确定的。例如,局部自动数组的元素个数必须用静态可
求值的表达式描述。这样,一个函数在调用时所需的存储量(用于安放该函数里定义的所有
自动变量)在编译时就完全确定了。函数定义里描述了所需要的自动变量和参数,定义了数
组的规模,这些就决定了该函数在执行时实际需要的存储空间大小。
以静态方式安排存储的好处主要是实现比较方便,效率高,程序执行中需要做的事情比
较简单。但这种做法也形成了对写程序方式的一种限制,使某些问题在这个框架里不好解决。
举个简单的例子:假设现在要写一个处理一组学生成绩数据的程序,被处理数据需要存储,
因此应该定义一个数组。由于每次使用程序时要处理的成绩的项数可能不同,我们可能希望
在程序启动后输入一个表示成绩项数的整数(或通过命令行参数提供一个整数,问题完全一
样)。对于这个程序,应该怎样建立其内部的数据表示呢?
问题在于写程序时怎样描述数组元素的个数。一种理想方式是采用下面的程序框架:
int n;
...
scanf(%d, n);
double scores[n];
... /* 读入成绩数据,然后进行处理 */
但是这一做法行不通。这里存在两个问题:首先是变量定义不能出现在语句之后。这个问题
好解决,可以引进一个复合语句,把scores 的定义放在复合语句里。第二个问题更本质,
在上面程序段里,描述数组 scores 大小的表达式是一个变量,它无法静态求出值。也就
是说,这个数组大小不能静态确定,C 语言不允许以这种方式定义数组。这个问题用至今讨
论过的机制都无法很好解决。目前可能的解决方案有(一些可能性):
1. 分析实际问题,定义适当大小的数组,无论每次实际需要处理多少数据都用这个数组。
前面的许多程序采用了这种做法。如果前期分析正确,这样做一般是可行的。但如果某
一次实际需要处理的数据很多,程序里定义数组不够大,这个程序就不能用了(当然,
除非使用程序的人有源程序,而且知道如果修改程序,如何编译等等。在现实生活中,
这种情况是例外)。
2. 定义一个很大的数组,例如在所用的系统里能定义的最大数组。这样做的缺点是可能浪
费大量空间(存储器是计算机系统里最重要的一种资源)。如果在一个复杂系统里,有
这种情况的数组不止一个,那就没办法了。如果都定义得很大,系统可能根本无法容纳
它们。而在实际计算中,并不是每个数组都真需要那么大的空间。
上面只是一个说明情况的例子。一般情况是:许多运行中的存储需求在写程序时无法确定。
通过定义变量的方式不能很好地解决这类问题。为此就需要一种机制,使我们能利用它写出
一类程序,其中可以根据运行时的实际存储需求分配适当大小的存储区,以便存放到在运行
中才能确定大小的数据组。C 语言为此提供了动态存储管理系统。说是“动态”,因为其分
配工作完全是在动态运行中确定的,与程序变量的性质完全不同。程序里可以根据需要,向
动态存储管理系统申请任意大小的存储块。
现在有了动态存储分配,可以要求系统分配一块存储,但是怎么能在程序里掌握和使用
这种存储块呢?对于普通的变量,程序里通过变量名去使用它们。动态分配的存储块无法命
名(命名是编程序时的手段,不是程序运行中可以使用的机制),因此需要另辟蹊径。一般
的语言里都通过指针实现这种访问,用指针指向动态分配得到的存储块(把存储块的地址存
入指针),而后通过对指针的间接操作,就可以去使用存储块了。引用动态分配的存储块是
指针的最主要用途之一。
与动态分配对应的是动态释放。如果以前动态分配得到的存储块不再需要了,就应该考
虑把它们交回去。动态分配和释放的工作
您可能关注的文档
- 20122012年度社会责任报告年度社会责任报告.PDF
- 2012三季度报告.PDF
- 2012年中关村高端领军人才---创业未来之星申报表.doc
- 2012年公司债券发行公告.PDF
- 2012年嘉兴市中小学生举重比赛竞赛规程.doc
- 2012年江苏省高等职业院校技能大赛信息安全技术应用与评估项目.doc
- 2012年生命科学学院教授论坛.doc
- 2013-2017年航标浮罐市场运行分析与发展.ppt
- 2013年全国青少年电子制作锦标赛科技创新评比办法.doc
- 2013年全国青少年跳绳邀请赛.doc
- 7.四川嘉林科技有限责任公司-建设项目环境影响报告表.PDF
- 9月14日以后生产符合三聚氰胺临时管理限量值规定乳制品汇总表(11.doc
- AltiumDesigner专题_关于尺寸_电子电路_工程科技_专业资料.doc
- Center马州乒乓球训练中心18761-Q.ppt
- CHINAAVIATIONOIL(SINGAPORE)CORPORATIONLTD中国航油(新加坡.PDF
- CSRC基金XBRL实例文档编制技术指引5号–临时公告.doc
- DS-8600HMF-TB技术规格书系统简介.PDF
- Exploit编写系列教程第九篇Win32Shellcode编写入门.PDF
- JMS规范1.1(中文版).PDF
- JOS实验三实验记录作者卓达城指导老师邵志远单位华中科技大学.PDF
最近下载
- 通信技术-使用Cypress需要避免的5个E2E测试错误(图文).pdf VIP
- 2025年小学一年级新生家长会ppt课件(优质ppt).pptx VIP
- 中国信通院2025人工智能高质量数据集建设指南74页.pdf VIP
- 2025-2026学年小学音乐三年级上册(2024)苏少版(2024)教学设计合集.docx
- 新征程,'心'启航——2025年秋学期开学第一课收心班会.pptx VIP
- Unit 1 How can I get there? PartA(说课稿)-2024-2025学年人教PEP版英语六年级上册[001].docx VIP
- 良好农业规范GAP记录表格.pdf VIP
- 2025年工会相关法律法规知识竞赛试题.doc VIP
- 高等土力学李广信22应力和应变.pptx VIP
- 消失模铸造工艺技术的创新与生产实践.pdf VIP
文档评论(0)