《嵌入式C语言存储器及指针.ppt》由会员分享,可在线阅读,更多相关《嵌入式C语言存储器及指针.ppt(30页珍藏版)》请在装配图网上搜索。

1、嵌入式C语言编程存储器及指针,GDAIB,Memory and Pointers,目录,指针与数组(Pointers and arrays) 函数指针(Function pointers) 内存陷阱(Memory pitfalls) 栈(Stacks),Page 2,指针与数组,C语言中只支持一维数组,且只支持静态数组。 数组的大小在编译的时候就必须作为一常数确定下来。 虽然C的数组只有一维,但是它的数组元素可以是任何数据类型的对象,因此一个数组的元素也可以是另外一个数组,这样就可以模拟出多维数组。 有关数组的操作即使是通过数组下标进行运算的,实际上都是通过指针进行的。,Page 3,多维数组。

2、,看左边的几个声明,请思考: Calendar4 是什么意思?,Page 4,数组名与指针,int a10; int *p; p = a; a+; p+; printf(“The size of a is %dn”, sizeof(a); printf(“The size of p is %dn”, sizeof(p); ,/*语法错误!a是常量!*/,/*语法正确! p是变量!*/,/*对于大多数32位系统,输出的结果是40 */,/*输出的结果是4 */,请指出下列代码中的错误及输出结果?,Page 5,数组作为函数的入口参数,char b10=“123456789”; main( ) f。

3、(b); void f(char a ) char c; a+; c = a0; printf(“The size of a is %dn”, sizeof(a); printf(“The size of b is %dn”, sizeof(b); ,void f(char *a) . ,/* a是指针,输出的结果是4*/,/*形参看起来是数组,实际已退化为指针*/,/*a是指针,因此自增运算是合法的!*/,/*a通过下标可以看起来像数组,但是它不是数组,而且此时c的值应该是”2”而不是”1”因为前面a做了自增运算*/,/* b是数组,输出的结果是10*/,/*真正传入f函数的是数组b的首地址。

4、指针*/,请分析这个程序?,Page 6,字符串数组与指向字符串的指针, char *p = “hello world! ”; char a = “hello world!”; p0 = H; a0 = H; p = a; ,在很多编译器中可能是非法的,因为p所指向的串可能存放在只读的存储空间,比如ROM或Flash,P重新指向a,但p原来指向的串将永远丢失,因为不知道原来那个串存放内存的地方,Page 7,指出左边的程序段有何不妥?,指针与数组(Pointers and arrays) 函数指针(Function pointers) 内存陷阱(Memory pitfalls) 栈(Stack。

5、s),Page 8,目录,函 数 指 针 定 义,int (*fp)(int); int *fp(int); int *(*fp_array10)(int); int *fp_array10(int);,声明一个函数指针变量fp,它指向一个入口参数与返回值都是整数的函数,声明一个函数fp(),该函数有一个整数参数,并且返回一个指向整数的指针,声明一个函数指针数组,它的每个元素都指向一个入口为整数且返回在值也为整数指针的函数,从运算符的结合性来看,为是一个函数数组,但C中没有这个概念,故这个声明有语错误!,Page 9,int *myfunction(int); int *(*fp)(int);。

6、 int *ptr; fp = myfunction; ptr = (*fp)(3); ptr = fp(3);,函 数 指 针 调 用,/*为fp赋初值,使它指向函数myfunction*/,/*通过函数指针调用函数,与myfunction(3) 的效果一样*/,/*这也是通过函数指针调用函数,与myfunction(3) 的效果一样*/,Page 10,多态(Polymorphism) 指用一个名字定义不同的函数,这些函数不同但操作类似,从而实现“一个接口,多种方法” 回调(Call_Back) 指操作系统来调用用户编写的函数,或由底层函数调用上层函数 多线程(Multithreading。

7、) 操作系统按一定的条件请允许多任务调度,则调用调度器选择合适的任务进行运行。,函 数 指 针 的 作 用,Page 11,指针与数组(Pointers and arrays) 函数指针(Function pointers) 内存陷阱(Memory pitfalls) 栈(Stacks),Page 12,目录,程序内存映像布局,1.静态映像(可执行文件): TEXT段、DATA段、BSS段; 2.动态映像(可执行文件运行): BSS段消失 增加堆和栈,Page 13,1. TEXT:保存指令代码、立即数等只读信息, 函数地址就在该段中分配 2. DATA:保存已初始化全局变量、静态变量。 其中。

8、又分为RODATA,保存字符串常量等只读数据 3. BSS: 记录未初始化全局变量、静态变量的标号的内存大小, 程序运行后为这里数据在DATA段分配内存并初始化为0 4、堆(Heap):保存临时动态分配内存 5、栈(Stack):保存临时静态分配内存,内存映像定义,Page 14,变量内存分配方式,1、静态分配: 在程序执行时由系统自动分配,使用完毕后由系统自动回收 根据类型大小自动在数据段、栈分配静态内存 好处是不存在内存泄露问题,但静态分配的内存有限 2、动态分配: 需要在代码中手动分配,使用完毕后必须在代码中手动回收 根据运行时的要求在堆上分配动态内存 好处是能动态分配很大的内存,但一旦。

9、忘记回收,内存泄露严重影响系统性能,Page 15,变量生存期,1、临时生存期:在栈上分配内存 在函数执行时为变量分配内存,函数执行结束回收内存 生存期是从进入函数起,到退出函数时结束 2、永久生存期:在数据段分配内存 在程序开始执行时为变量分配内存,程序结束回收内存 生存期是从进入程序起,到退出程序时结束,Page 16,看看这段代码有什么问题?,char *DoSomething() char i32*1024; memset(i,0,32*1024); return i; ,两个重大问题: 1、自动变量数组i 是通过堆栈实现的,太大的临时变量数组会冲掉堆栈 2、返回堆栈中的地址是非常危险。

10、的,因为堆栈中的值永远是不确定的,Page 17,将i所指向的内存中的每个字节的内容全部设置为0 . 这个函数通常为新申请的内存做初始化工作,看看这段代码有什么问题?,void DoSomething() int i; int j; int k; memset( ,这段代码的作用是将3个局部变量清零 但是这段代码有两个假设: 1、编译器将I,j,k三个变量通过堆栈表示 2、压栈顺序是 I, j , k (假设堆栈是满递减堆栈) 3、如果K在寄存器怎么办?对K取地址操作将产生Data Abort(中止),Page 18,关于临时变量,不要对临时变量作取地址操作,因为你不知道编译器是否将这个变量映。

11、射到了寄存器 不要返回临时变量的地址,或临时指针变量,因为堆栈中的内容是不确定的(出了这个函数,存放在堆栈中的局部变量就没有意义了!) 不要申请大的临时变量数组,你的临时变量是在堆栈中实现的,你有多大的堆栈呢?,局 部 变 量,Page 19,由函数malloc() 和free() 管理动态存储区,这个存储区一般称为“堆”(Heap),问题: 现在要为一个矩形区域(宽x,高y)申请一块内存保存这块的数据,如果每个像素点(Pixle)占用2个bit,如何分配内存?(参考P.131) char *buffer; buffer = malloc (x*y/4);,修正方法:buffer = mall。

12、oc(x*y/4 + 1); (课本中还有其它修正方法),动 态 存 储 区,Page 20,看看这段代码有什么问题? (参考P.132),char *DoSomething() char *p, *q; if ( (p = (char*) malloc(1024) = NULL ) return NULL; if ( (q = (char*) malloc(2048) = NULL ) return NULL; return p; ,如果p申请成功,而q没有申请到,首先应该释放p,然后再返回NULL,否则p所指的1024字节空间就永远被“遗忘”,将永远占据Heap的空间造成“内存泄漏”,内 。

13、存 泄 漏Memory Leakage,if ( (q = malloc(2048) = NULL ) free(p); return NULL; ,在使用malloc()时,先检查函数的返回值是否为空很有必要,Page 21,忘记释放已分配的动态存储空间 A程序员分配的一块内存,B程序员使用了它,但没有沟通好由谁来释放 free()只能释放由malloc()返回的指针,如果free()的入口参数不是正确的指针或malloc()分配空间的头部信息被破坏, 造成free() 释放无效。,内 存 泄 漏 的 原 因,Page 22,Free()释放无效 示例,void DoSomething(ch。

14、ar* ptr;) char *p; int i; if (ptr = NULL) return; if (p =(char*)malloc(1024) = NULL ) return ; for(i = 0; i 1024; i+) *p+ = *ptr+; free(p); return ; ,/*入口参数合法性检查*/,/*分配空间,并检查是否为空*/,/*语句无效,因p的值已发生改变,free()将无法释放,Page 23,void FreeWindowsTree(windows *Root) if(Root != NULL) window *pwnd; for(pwnd = Root。

15、-Child;pwnd != NULL;pwnd = pwnd-Sibling) FreeWindowTree(pwnd); if(Root-strWndTitle != NULL) FreeMemory(Root-strWndTitle); FreeMemory(Root); ,“野”指针,“野”指针:指那些不知指向什么内容或者指向的内容已经无效的指针,思考这个代码有什么问题?,/* 释放pwndRoot 的子窗口. */,/* pwnd已经被释放了,但在for循环中被再次引用*/,Page 24,规避动态存储区的内存陷阱的方法(P.137),总是检查动态内存分配是否成功后再引用该指针! 对。

16、分配成功的动态存储区需要将其初始化后再使用 要特别小心访问越界,如数组下标或循环次数等 分配内存空间是总是使用sizeof,并且别忘了加1 总是释放由malloc()函数返回的指针 错误处理时不要忘了其他已分配空间的释放 为了避免“野”指针,对于被释放的动态内存,最好立刻将指向这块内存区的指针变量赋值为NULL,Page 25,指针与数组(Pointers and arrays) 函数指针(Function pointers) 内存陷阱(Memory pitfalls) 栈(Stacks),Page 26,目录,定义:指一块内存区域,该区域的管理(内存空间的分配与回收)采用类似数据结构中“栈”的特点进行操作。 特点: 遵循“后进先出、先进后出”的特点 相关术语:压栈(进栈)、退栈(出栈)、 栈的清理,栈(Stacks),Page 27,栈的四种类型(p.141),Page 28,传递函数调用的参数 保存函数调用的返回地址 (对于中断处理程序及程序状态字寄存器) 保存函数在被调用函数中需要使用的寄存器的值 实现局部变量,堆栈的作用(p.142),Page 29,利用堆栈有以下四个作用:,Page 30,End。

c语言指针 ppt,嵌入式C语言存储器及指针.ppt相关推荐

  1. 05 C语言框架讲解(嵌入式C语言要学哪些内容,学习路线)

    C语言框架讲解(C语言要学哪些内容,学习路线) b站配套视频地址 CSDN有图阅读地址 Gitee文档源码地址 作者 将狼才鲸 日期 2021-07-17 注:gitee暂不支持markdown me ...

  2. c语言 函数要素,嵌入式C语言教程以及C编程要素

    原标题:嵌入式C语言教程以及C编程要素 计算机嵌入式行业逐渐成为就业者的新宠儿,而作为一个嵌入式C编程技术人员,熟练使用C语言是非常重要的,下面尚观教育小编就来跟大家聊一聊嵌入式C语言教程以及C编程要 ...

  3. 【嵌入式】C语言高级编程-嵌入式C语言简介(01)

    00. 目录 文章目录 00. 目录 01. C 语言标准 02. C 标准内容 03. C 标准的发展历程 04. 编译器对 C 标准的支持 05. 编译器对 C 标准的扩展 06. Linux内核 ...

  4. 知名外企嵌入式C语言笔试试题

    知名外企嵌入式C语言笔试试题 嵌入式C语言笔试试题 知名外企嵌入式C语言笔试试题 一. 选择题 二. 填空题 三.写出程序的运行结果 一. 选择题 01.C语言合法的常量是() A-45 B.078 ...

  5. c语言编码风格,讲嵌入式C语言编码风格.ppt

    讲嵌入式C语言编码风格 目 录 简介及说明 语言规则 1.基础 2.数据 3.说明与表达式 4.函数 5.内存及资源 6.源文件 风格指导 7.程序书写 8.命名 9.文档 简介及说明 正确性 易维护 ...

  6. 找到指针的奇数位置 c语言,(ppt)【C语言程序设计】上机作业2010.ppt

    (ppt)[C语言程序设计]上机作业2010 <C程序设计>上机作业 上机时间: 第6周周日上午8:30~11:30, 第8.10.12周周二晚上6:50~9:50 上机地点:科A506 ...

  7. c语言程序设计指针何钦铭ppt,C语言程序设计 教学课件 作者 何钦铭 c2.ppt

    C语言程序设计 教学课件 作者 何钦铭 c2.ppt (65页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 Chap 2 基本数据类型和表 ...

  8. 【嵌入式C语言】4.指针

    0.前言 本章开始主要讲解C语言内存空间的使用. 这里的内存泛指RAM资源.内存条资源.显卡资源.IIC资源等等. 本文主要整理指针的使用方法. 内存属性: 1.内存操作的大小 2.内存的变化性,可写 ...

  9. C语言结构体与指针ppt,c语言指针和结构体:链表详解.ppt

    c语言指针和结构体:链表详解.ppt 1,第十一章 链表,2,例跳马.依下图将每一步跳马之后的位置x,y放到一个"结点"里,再用"链子穿起来",形成一条链,相邻 ...

最新文章

  1. 一位39岁程序员的困惑:知道得越多编程越慢怎么办?
  2. 计算机网络教会我们什么,日久见人心现实教会了我们什么叫人心的说说
  3. 新手学JAVA(六)----处理随机性的数据
  4. 今年大事:年终汇算清缴,你是退还是补?惊喜还是惊吓?
  5. Top-push Video-based Person Re-identification
  6. Visual Studio 2008 快捷键大全
  7. 李善友:为什么外企人不敢创业
  8. 内连接、左外连接、右外连接、交叉连接区别
  9. html5 mask,HTML5 Canvas渐进填充与透明实现图像的Mask效果
  10. rubymongo_mapper
  11. 奇怪的比赛--蓝桥杯
  12. 制作JD的手动和自动轮播图片板块
  13. 5.2.8.字符设备驱动代码实践1
  14. Python一些常用模块
  15. android媒体--stagefright概述
  16. 友华PT921G光猫实现黑群晖外网唤醒
  17. win10下装黑苹果双系统
  18. 纯真IP数据库QQWry.dat格式详解
  19. HFDS的Shell操作
  20. 4个小方法,让你的抖音发出来的视频更清楚

热门文章

  1. 微信小程序家庭理财系统+后台管理系统|前后分离VUE
  2. 水资源行业建设物联网有什么好处?
  3. 【机器学习】用QR分解求最小二乘法的最优闭式解
  4. arcgis交通二维图形转三维模型
  5. airpods二代圆点按钮是啥_airpods按钮怎么用
  6. 【题解】【算法】- 洛谷 - P3799 妖梦拼木棒(组合数学)
  7. 多个数据写入excel的操作
  8. 关于非制冷红外探测器灼伤问题说明
  9. 计算机应用键盘的组成指导书,计算机应用基础实习指导书.doc
  10. 网络最重要的学习工具--网络模拟器GNS3、EVE-NG