网站大量收购闲置独家精品文档,联系QQ:2885784924

C语言中级教程 内存使用-6.pptVIP

  1. 1、本文档共31页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言中级教程内存使用-6ppt课件

小结 stack、static、heap三者的区别仅在于效率。前者有最快的速度、最短的寿命,这是最经济的使用,但必须在编译前就固定下来,不能再变,因此它没有灵活性。这个区不可以动态申请,不属动态区。 静态变量仅比栈变量稍长命些,且能被初始化,它也同于栈变量没有灵活性。 堆内存最灵活,它是动态分配的,也就是可以在程序运行中即时申请,且管理原则是按链表管理的,于是时耗远大于栈,这是灵活的代价。这个区是真正的动态区。 * C语言中级培训 六、内存使用 对变量起作用的属性有两个:存储类和类型。 存储类决定着该变量的诞生地——存储区域。 存储区域决定着变量的作用范围和生命期,这两 方面的性质统称为变量的属性。 同一存储区域内的所有变量具有相同的属性; 各存储区域的变量各有不同的属性。 变量的属性 栈区auto 静态区static 堆区heap 代码区code 数据区 代码区 memory 存放程序的代码 存放程序的全局数据和静态数据 存放程序动态申请的数据 存放程序的局部数据和参数 内存的划分 分为4个区域: 各区域的特点 1 栈区 stack 由系统按栈原则管理, 编译时就已经“规划”好了,运行时才使用, 短命, 程序运行时已经存在, 用户无法干预变量的诞生和消亡, 有名称,亦可无名。 规划了,是指编译器位个变量预订了房间,尚未实施。到被调用时方才实施。 各区域的特点 2 静态区 static 编译时已确定并初始化了, 用户无法干预, 有名称,亦可无名, 不按栈原则管理,但仍受“域”的制约, 较长命, 该区存有全局变量(外部变量)、局部静态变量和常量。(为何将常量放在静态区?常量是用来初始化变量的,函数中的局部变量初始化所需的常量,不必重复保管,放在静态区中供大家共用,是合理的选择。) 各区域的特点 3 代码区 code 存有程序的所有函数代码, 用户无法干预,只能通过函数名调用, 每段代码都有名称——函数名, 程序结束即释放。 通常紧挨着静态区。 各区域的特点 4 堆区 heap 长命, 无名称, 不受作用域限制, 用户可以干预变量的诞生和消亡, 在程序运行时才动态分配, 该区的使用将付出更大的代价, 申请可能失败。 区域对数据的影响 函数数据 函数数据 函数数据 函数数据 函数数据 文件数据 文件数据 程序数据 程序 文件 函数 GOTO 静态区:全局变量(靠位置分辨),局部静态变量(用 static分辨) ,常量(靠自身分辨) 。 栈区:局部变量又称为自动变量(包括函数的形参)。 靠auto分辨,对应的是程序中的“块”。 堆区:堆变量(靠申请分辨) 编译器可能会将程序所用到的多个常量优化成同一个。 问:局部静态变量有何特点?有何优劣? 各区域的数据名称 对内存的访问 通过变量名访问 如 int a, 则可以用a来访问变量的内容;如图。 通过地址值访问 如 int a(假设a的地址值为0,则可以通过*((int*)0来访问a的内容;如图。 通过指针访问 如 int a; int *p=a; 则可以用*p来访问变量的内容;如图。 p a ((int*)0 //main.cpp int a = 0; //全局静态区 char *p1; main() { ????int b; //栈 ????char s[] = abc; ????char *p2; ????char *p3 = 123456; // 123456\0在常量区 ????static int c =0; //全局静态区 ????p1 = (char *)malloc(10); p2 = (char *)malloc(20); ? //分配得到的10和20个字节都在堆上 ??strcpy(p1, 123456); // 123456\0在常量区,编译器 } // 可能会将它与p3所指向的“123456”优化成同一个。 关于register

文档评论(0)

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

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

1亿VIP精品文档

相关文档