C知识点总结静态动态存储.doc

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C知识点总结静态动态存储

几个问题: 局部变量和静态变量的存储 即局部变量可以用类型相符的任意表达式来初始化,而全局变量和静态变量只能用常量表达式(Constant Expression)初始化。因为对它们的初始化是在编译阶段完成的。 为什么不应返回指向局部变量的指针。 char * itoa() { char str[20]; return str; } 若多次调用函数,为什么b=3都不再执行了? fun(){ static int b=3; b++; } 对b的初始化操作在编译时已经完成了。 递归函数的变量n,有几个? void f(int n){ if (n=0) return ; printf(“%d\n”, n); f(n-1); printf(“n %p n=%d\n”, n, n); } 为什么左边的会打印出乱码,而右边的可以正常输出 char * getmemory() { char str[]=”hello world”; return str; } int main() { char *ptr=getmemory(); printf(“%s\n”,ptr); return 0; } main栈帧 ptr printf栈帧 printf会占用以前getmemory的栈空间,改写这块内存。导致这里的字符串被改写。printf打印时出现乱码。 void fun(char *p) { int a[10]; printf(“%s\n”,p); } char * getmemory() { char str[]=”hello world”; return str; } int main() { char *ptr=getmemory(); fun(ptr); return 0; } fun函数占用了getmemory的栈空间,但是fun的局部变量数组a因为没有初始化,所以只为a分配了内存,却没有修改a占用的内存;该内存的内容还是以前的内容。效果就是,a把字符串“hello world”保护起来。使得printf能打印出它。 函数栈帧是什么时候分配的?执行函数体时分配的 地址空间 物理内存是从0号开始编址,为什么0号地址不能访问,下面的代码总是段错误 例:int *ptr=NULL; int a=*ptr; 为什么不能修改常量区的数据,这是如何被保护的。 例:int *ptr=”hello”; *ptr=’m’; 讲这些之前,首先让我们了解虚拟存储器的概念 虚拟存储器 (理论参考《存储管理》PPT,另参考《深入理解计算机系统》和《C专家编程》7.3节对虚拟内存的思考) 硬盘、内存、CPU寄存器,还有本节要讲的Cache,这些都是存储器,计算机为什么要有这么多种存储器呢?这些存储器各自有什么特点? 由于硬件技术的限制,我们可以制造出容量很小但很快的存储器,也可以制造出容量很大但很慢的存储器,但不可能两边的好处都占着,不可能制造出访问速度又快容量又大的存储器。因此,现代计算机都把存储器分成若干级,称为Memory Hierarchy(存储器层次结构),按照离CPU由近到远的顺序依次是CPU寄存器、Cache、内存、硬盘,越靠近CPU的存储器容量越小但访问速度越快,下图给出了各种存储器的容量和访问速度的典型值。 特点: ①将整个存储系统看作一个大内存。一般而言,冲高层往底层走,存储设备变得更慢、更便宜和更大。对于每个k,位于k层的更快更小的存储设备作为位于k+1层的更大更慢的存储设备的缓存。换句话说,层次结构中的每一层都缓存来自较低一层的数据对象。目的,让程序不受系统物理内存大小的限制。 ②基于缓存的存储器层次结构行之有效,是因为较慢的存储设备比较快的存储设备更便宜,还因为程序往往展示局部性,具有良好性的程序通常比局部性差的程序运行得更快。() 局部性原理(principle of locality):是指程序在执行过程中的一个较短时期,所执行的指令地址和指令的操作数地址,分别局限于一定区域。表现为: 1.时间局部性:即一条当前被执行的指令可能很快又被执行,或一个当前被访问的数据可能很快又被访问到。那么他应当保存在缓存中。用在数据块淘汰算法。 2.空间局部性:即一条当前被执行的指令,它邻近的几条指令也可能要被执行;或一条当前被访问的数据,他邻近的数据也可能要被访问。那么他应当保存在内存中。用在指令和数据的预取功能(数据总是以块大小为传送单元在第k层和第k+1层之间来回拷贝的;不同层次之间可以有不同的块大小)。 局部性原理的具体体现 程序在执行时,大部分是顺序执行的指令,少

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档