存储器与指针.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文档。上传文档
查看更多
存储器和指针 (Memory Pointer) 罗海波 robhappy@ 目录 存储器,依旧是存储器 指针是个等待降服的魔鬼 内存陷阱 动态内存分配算法及其代码示例 堆栈 4种不同的堆栈组织形式(P141) 堆栈的作用: 传递函数调用的参数 保存函数调用的返回地址 保存在被调函数中需要使用的寄存器的值 实现局部变量 调用栈帧和中断栈帧 任务栈空间在使用时注意! 定义函数和ISR中的局部变量,特别是定义大型数组和数据结构时。 函数的嵌套与递归的深度。 中断嵌套的深度 库函数需要的栈空间 指针 数组 指针 字符串 下面两者的区别?? 1: char* p = “hello,world!”; 2: char a[ ] = “hello,world!”; 上面两者的“hello,world!”内容分别存储在哪里? 是否可以修改p和a指向的内容? p指向别处后,“hello,world!”会不会丢失? 符号名和符号表 指针 函数 int (*fp)(int) ?? int * fp(int) int* (*fp_array[10])(int) ? ? int** fp_array[10](int) 函数指针的作用 多态 (polymorphism):指用一个名字定义不同的函数,这函数执行不同但 又类似的操作,从而实现“一个接口,多种方法”。 多线程 (multithreading):将函数指针传进负责建立多线程的 API 中:例如 Win32 的 CreateThread(...pF...)。 回调 (call-back):所谓的回调机制就是:「当发生某事件时,自动呼叫某 段程序代码」。事件驱动 (event-driven) 的系统经常透过函数指针来实现 回调机制,例如 Win32 的 WinProc 其实就是一种回调,用来处理窗口的 讯息。 多态举例 多态举例 回调(call-back) 回调 – 由OS调用用户编写的函数,或者由底层函数调用上层函数。简言之,服务提供者调用了服务使用者实现的函数。 P125 多线程 构建多任务、注册一个新的任务 P127 内存陷阱 程序员能从哪些地方(通过哪些方式)获取存储空间? 局部变量(栈 or 寄存器) C编程中关于局部变量的处理的注意事项 对临时变量的取地址操作可能会无效。 不要返回临时变量的地址或临时指针变量。 不要申请太大的临时变量数组。 动态内存区(堆heap?malloc,free) 1. 避免申请空间不足 某个矩形区域具有x*y个像素点,每个像素点2bit编码,该申请多大的内存保存该区域数据? 2. 内存泄露(申请了木有释放) 内存泄露 3 reasons: return前忘了释放前面申请的内存。 互相扯皮(A申请了给B用,B木有释放) free不成功(这个问题有点头大)。 example for : free不成功 how to avoid memory leakage 1. malloc了就应该要释放。 2. 注意保存malloc返回的指针,避免free失败。 3. 小心数据溢出,从而擦除掉别人的free头部。 4. 不要扯皮:谁申请谁释放,谁污染谁治理。 野指针 3 reasons: 指针在初始化之前就引用。 某指针所指向的内存空间已释放,但仍然引用。 一个好的习惯是:free后显式的将指针赋值NULL 返回局部变量的地址。 内存陷阱总结 几个方面: 内存的分配不足 内存泄露(内存不足) 野指针(指针瞎访问) 如何避免动态内存的内存陷阱? P137 函数利用指针来传递参数 包括利用指针传入数据和传出数据。 如果传入数据时,约定数据只读,则用const来修饰该指针形参。 请自行阅读P137 – P140代码 动态内存分配算法及举例 问题的提出: 能分配合适大小的动态内存区,并返回首指针。 如果没有足够的内存,则返回NULL。 可调用free函数释放归还。 效率尽可能高并减少内存碎片。 分配 释放 * 嵌入精彩生活 * 最后一个参数 入口参数 …… 函数返回地址 局部变量 …… 局部变量 保存的调用函数的寄存器值 中断返回地址 程序状态字 局部变量 保存的中断前所用到的寄存器 调用栈帧结构 中断栈帧结构 Q: 如何理解这两个栈帧结构? 调用子函数时,子函数内部如何访问局部变量和入口参数? 函数调用返回时,SP指针会发生什么? 为何中断栈帧没有参数传递? 可以采用高水位计的方法调试出任务所需要的栈空间大小。 int a[10]; int *p; …… p = a; a++; //ok?? p++; //ok?? printf(“%d\n”,sizeof(a));

文档评论(0)

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

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

1亿VIP精品文档

相关文档