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