嵌入式Linux C语言程序设计基础教程第10章 嵌入式C语言的高级用法.ppt

嵌入式Linux C语言程序设计基础教程第10章 嵌入式C语言的高级用法.ppt

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
华清远见教育集团 高端IT就业培训专家 华清远见教育集团 扫描大树或关注(微信号:farsight2013) 第一时间获取更多华清远见课程信息。 谢 谢! 华清远见教育集团 * * 第十章 嵌入式C语言的高级用法 本章的要求 掌握C语言中的内存管理 熟悉动态内存 掌握堆和栈的区别 内存管理 C/C++定义了4个内存区间: 代码区/全局变量与静态变量区/局部变量区即栈区/动态存储区,即堆区。 静态存储分配 通常定义变量,编译器在编译时都可以根据该变量的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间。 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 内存管理 动态存储分配 有些操作对象只有在程序运行时才能确定,这样编译器在编译时就无法为他们预先分配空间,只能在程序运行时分配。 所有动态存储分配都在堆区中进行。 程序在运行的时候用malloc或new申请任意大小的内存。程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。 内存管理 堆内存的分配与释放 当程序运行到需要一个动态分配的变量或对象时,必须向系统申请取得堆中的一块所需大小的存贮空间,用于存贮该变量或对象。当不再使用该变量或对象时,也就是它的生命结束时,要显式释放它所占用的存贮空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。 堆区是不会自动在分配时做初始化的(包括清零),所以程序中需要显式的初始化。 动态内存 malloc/free void * malloc(size_t num) void free(void *p) malloc函数只关心申请的内存的大小。 malloc申请到的是一块连续的内存,有时可能会比所申请的空间大。其有时会申请不到内存,返回NULL。 malloc返回值的类型是void *,所以在调用malloc时要显式地进行类型转换,将void * 转换成所需要的指针类型。 释放一块内存中的一部分是不被允许的。 不允许重复释放。 动态内存 malloc/free free(p)是释放p所指的空间,而不是释放p本身的空间。释放堆空间后,p成了野指针。 malloc与free是配对使用的, free只能释放堆空间。如果malloc返回的指针值丢失,则所分配的堆空间无法回收,称内存泄漏,同一空间重复释放也是危险的,因为该空间可能已另分配,所以必须妥善保存malloc返回的指针,以保证不发生内存泄漏,也必须保证不会重复释放堆内存空间。 动态内存 malloc/free 野指针: 不是NULL指针,是指向“垃圾”内存的指针。“野指针”是很危险的。 出现“野指针”主要有以下原因: 指针变量没有被初始化。 指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。 指针操作超越了变量的作用范围。这种情况让人防不胜防。 堆和栈的区别 申请方式 栈(stack)是由系统自动分配的。例如,声明函数中一个局部变量“int b;”,那么系统自动在栈中为b开辟空间。堆(heap)需要程序员自己申请,并在申请时指定大小。使用C语言中的malloc函数的例子如下所示。 p1 = (char *)malloc(10); 申请后系统的响应 只有栈的剩余空间大于所申请空间,系统才为程序提供内存,否则将报异常,提示栈溢出。 堆和栈的区别 堆在操作系统中有一个记录空闲内存地址的链表。当系统收到程序的申请时,系统就会开始遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该节点从空闲结点链表中删除,并将该节点的空间分配给程序。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小。这样,代码中的删除语句才能正确地释放本内存空间。如果找到的堆节点的大小与申请的大小不相同,系统会自动地将多余的那部分重新放入空闲链表中。 堆和栈的区别 申请大小的限制 堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统用链表来存储的空闲内存地址,地址是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存,因此堆获得的空间比较灵活,也比较大。 栈是向低地址扩展的数据结构,是一块连续的内存区域。因此,栈顶的地址和栈的最大容量是系统预先规定好的,如果申请的空间超过栈的剩余空间时,将提示栈溢出,因此,能从栈获得的空间较小。 堆和栈的区别 堆和栈中的存储内容 堆一般在堆的头部用一个字节存放堆的大小,堆中的具体内容由程序员安排。 在调用函数时,第一个进栈的是

文档评论(0)

132****9295 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档