第6章_内存管理.pptVIP

  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文档。上传文档
查看更多
第6章 内存管理 6.1 静态内存与动态内存 在程序开始运行时由系统分配的内存称为静态内存,在程序运行过程中由用户自己申请的内存称为动态内存。 6.1.1 静态内存 静态内存的申请是由编译器来分配的。使用静态内存对用户是很方便的。用户并不需要了解分配内存的具体细节,也不需要时刻考虑由于在程序结束前未释放所占用的内存空间而带来的可用内存泄漏。 但是,静态内存也存在着一定的缺陷。首先,由于静态内存总是预先定义了存放数据的数组大小,这就有可能因为所传入的数据量大于数组容量而引发溢出问题。其次,由于在某个函数中分配的静态内存将在此函数运行结束时被系统自动释放,使用指针由子函数指向主函数传递数据的设想就无法被实现。 例6-1、下面的程序试图通过返回子函数中的char指针而使主函数中的char指针指向某一特定的字符串。但由于子函数upcase中的newstring是静态内存,当子函数返回时就被系统释放了。因而无法实现用户期望的操作。 #includestdio.h #includestdlib.h char *upcase(char *inputstring); int main(void) { char *str1,*str2; str1=upcase(Hello); str2=upcase(Goodbye); printf(str1=%s,str2=%s\n,str1,str2); return 0; } char *upcase(char *oldstring) { int counter; char newstring[100]; strcpy(newstring,oldstring); for(counter=0;counterstrlen(newstring);counter++) { if(newstring[counter]=97newstring[counter]=122) newstring[counter]-=32; } return newstring; } 例6-2 可以修改如下: #includestdio.h #includestdlib.h char upcase(char *inputstring,char *newstring); int main(void) { char str1[100],str2[100]; upcase(Hello,str1); upcase(Goodbye,str2); printf(str1=%s,str2=%s\n,str1,str2); return 0; } char upcase(char *inputstring,char *newstring) { int counter; strcpy(newstring,inputstring); for(counter=0;counterstrlen(newstring);counter++) { if(newstring[counter]=97newstring[counter]=122) newstring[counter]-=32; } } 6.1.2 动态内存 使用动态内存时,用户可自行控制内存的分配和释放。这就是说,用户可以根据需要随时申请所需内存,在使用完毕后手动将此内存区域释放。 但动态内存的使用也存在着巨大隐患。在大型由于程序中,由于在释放某块动态内存前将指向该内存区域的指针重新赋值,从而使得此内存区域无法被释放的情况是十分常见的。通常将内存分配后没有被释放而导致可用内存减少称之为内存泄漏。避免内存泄漏耗尽系统资源正是许多服务器每隔一段时间就需要重新启动的原因。 6.2 安全性问题 由于内存使用的问题,常常引发一些安全性问题。如内存溢出、内存泄漏等问题。 溢出错误的一种情况是,当使用静态内存时,定义了一个含有100个元素的数组,如果要将数据量大于100的一组数据写入这个数组,将发生溢出错误。虽然通常情况下程序将因此错误而终止,但在某些时候还是会因为覆盖了此缓冲区之后的数据而导致错误的发生。 要解决溢出的问题,一个最基本的想法是在用户程序中根据缓冲区大小截断所输入的数据。 例6-3 在下面的程序中,字符串str1和str2的长度故意设置得很小。当实际输入的字符串的长度大于字符串所限制的长度时,超出部分将被截断。 #includestdio.h #includestring.h void upcase(char *inputstring,char *newstring,size_t n);

文档评论(0)

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

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

1亿VIP精品文档

相关文档