C语言程序设计PPT课件(共13章)第10章C 语言内存管理.pptxVIP

C语言程序设计PPT课件(共13章)第10章C 语言内存管理.pptx

  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文档。上传文档
查看更多
第10章 C 语言内存管理 目录 CONTENT 10.1 10.2 10.3 存储模型 内存组织方式 项目组件 01 存储模型 存储类可定义 C 程序中变量以及函数的范围和生命周期,使用时将这些说明符放在其 需要修饰的类型之前即可,常见的存储类如 auto、register、static、extern 等。 10.1.1 auto 存储类 使用 auto 存储类型说明的变量都是局限于某个程序范围内的,只能在某个程序范围内 使用,通常在函数体内或函数中的复合语句里。auto 存储类是所有局部变量的默认存储类。 C 语言中,在函数体的某程序段内说明 auto 存储类型的变量时,可以省略关键字 auto, 如下所示。 如上述代码,定义了两个相同存储类的变量,即意义相同。 10.1.2 register 存储类 register 称为寄存器型,使用 register 关键词说明变量,其主要的目的是将所说明的变量 放入 CPU 的寄存器存储空间中,这样可以加快程序的运行速度。由于变量不在内存中,不 能对其使用运算符。如下所示。 10.1.3 static 存储类 static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它 进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之 间保持局部变量的值。究其原因是,static 存储类型的变量在内存中是以固定地址存放的, 而不是以堆栈方式存放。 10.1.3 static 存储类 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内,不能被其他文件访 问。 static 修饰局部变量,如例 10-1 所示。 分析: 如上述示例中,第 22~24 行代码分别调用 func1()函数,将参数与局部变量 num 相加。 第 30~32 行代码分别调用 func2()函数,同样将参数局部变量 num 相加。不同的是,func2() 函数中使用 static 修饰局部变量 num,因此在程序未退出时,该变量总能保持上一次执行后 的结果,第一次操作后 num 的值为 10,第二次操作后 num 的值为 20,第三次操作后 num 的值为 30。 10.1.4 extern 存储类 extern 称为外部引用型,用于提供一个全局变量的引用,全局变量对所有的程序文件都 是可见的。当有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在 其他文件中使用 extern 来得到已定义的变量或函数的引用,也就是说,在文件中引用在其他 文件中函数体外部说明的变量。 使用 extern 引用外部变量,如例 10-2、10-3 所示。 分析: 如上述示例中,例 10-2 中定义了全局变量 a、b 并初始化。在例 10-3 中,第 8 行代码 分析: 输出: 分析: 使用变量 a、b,由于变量 a、b 不属于本文件,因此使用 extern 声明引用例 10-2 中的变量。 编译时将以上两个文件共同编译。 10.2 内存组织方式 10.2.1 程序的内存分配 源程序经过编译后,变为可被机器识别并运算的指令和数据,存储在同一逻辑内存空间 中。运行后的程序在内存中主要被分为 4 个逻辑段。 (1)程序代码段,具有只读属性。 (2)数据段,存放全局变量和静态变量(static 修饰的变量)。 (3)栈,由系统自动分配释放,存放函数的参数值、局部变量以及返回值等。 (4)堆,存放动态分配的数据,一般由程序动态分配和释放,如果程序不释放,程序 结束时可能由操作系统回收。 有些操作对象只有在程序运行时才能确定,这样编译器在编译时就无法为它们预定存储 空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方式称为动态分配。 所有动态存储分配都在堆区中进行。 当程序运行到需要一个动态分配的变量或对象时,必须向系统申请取得堆中的一块所需 大小的存储空间,用于存储该变量或对象。当不再使用该变量或对象时,要显式释放它所占 用的存储空间,这样系统就能对堆空间进行再次分配,做到重复使用有限的资源。 10.2.2 动态管理 在 C 语言程序中,由 C 库提供的一系列函数,可实现从堆区中动态申请和释放内存。 1. malloc()函数 malloc()函数的原型定义如表 10.1 所示。 malloc()返回值为 void 型指针,可知 malloc()函数本身并不识别要申请的内存是何种类 型,其只关心申请内存的总字节数。malloc 有时会申请不到内存,此时函数返回值为 NULL。 由于 malloc()函数的返回值为 void *,在调用 malloc()函数时需要显式地进行类型转换,将 void *转换为存放数据的类型

您可能关注的文档

文档评论(0)

139****1983 + 关注
实名认证
文档贡献者

副教授、一级建造师持证人

从事职业教育近20年,高级职称。

领域认证该用户于2023年06月21日上传了副教授、一级建造师

1亿VIP精品文档

相关文档