精品-清华大学C语言课件 第15章01 内存组织方式

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图15.2 栈操作
程序员经常会利用栈这种数据结构来处理那些最适用后进先出逻辑来描述的编程问题。这里讨论 的栈在程序中都会存在,它不需要程序员编写代码去维护,而是由运行时系统自动处理的。所谓的运 行时系统维护,实际上就是编译器所产生的程序代码。尽管在源代码中看不到他们,但程序员应该对 此有所了解。这个特性和后进先出的特性是栈明显区别于堆的标志。
当函数A的实参压入栈后,函数B就在栈中以自变量的形式建立了形参。函数B内部的其他自变量 也是存放在栈里的。由于这些进栈操作,栈指针已经移到所有这些局部变量之下。但是函数B记录了 刚开始执行时的初始栈指针,以这个指针为参考,用正偏移量或负偏移量来访问栈中的变量。
当函数B正准备返回时,系统弹出栈中的所有自变量,这时栈指针移到了函数B刚开始执行时的位 置。接着,函数B返回,系统从栈中弹出返回地址,函数A就可以继续执行了。
#include<stdio.h> void DisplayB(char* string)/*函数B*/ { printf("%s\n",string); } void DisplayA(char* string)/*函数A*/ { char String[20]="LoveWorld!"; printf("%s\n",string); DisplayB(String);/*调用函数B*/ } int main() { char String[20]="LoveChina!"; DisplayA(String);/*将参数传入函数A中*/ return 0; }
那么栈是如何工作的呢?例如当一个函数A调用另一个函数B时,运行时系统将会把函数A的所有 实参和返回地址压入到栈中,栈指针将移到合适的位置来容纳这些数据。最后进栈的是函数A的返回 地址。
当函数B开始执行后,系统把函数B的自变量压入到栈中,并把栈指针再向下移,以保证有足够的 空间来存储函数B声明的所有自变量。
当函数A继续执行时,系统还能从栈中弹出调用者的实参,于是栈指针又回到了调用发生前的位 置。
实例1 在堆中分配内存并释放
在本实例中,使用malloc分配一个整型变量的内存空间,在使用完该空间后。使用free函数进行释放。
#include<stdio.h> #include <stdlib.h> int main() { int *pInt;/*定义整型指针*/ pInt=(int*)malloc(sizeof(int));/*分配内存*/ *pInt=100;/*使用分配内存*/ printf("数值是:%d\n",*pInt);/*输出显示数值*/ free(pInt);/*释放内存*/ return 0; }
运行程序,显示效果如图15.4所示:
图15.4 栈在函数调用时的操作 在本程序中,定义函数A和B,其中在函数A中再次调用函数B。根据栈的原理移动栈中指针,进行 存储数据。
Thank you
局部数据对象、函数的参数以及调用函数和被调用函数的联系放在称为栈的内存池中。 但是以上的4类根据操作平台和编译器的不同,堆和栈可以是被所有同时运行的程序共享的操作 系统资源,也可以是使用程序独占的局部资源。
堆与栈
在内存组织方式可以看到堆是用来存放动态分配内存空间的,而栈是用来存放局部数据对象、函数的 参数、调用函数和被调用函数的联系。接下来对两者进行详细的说明。 堆
内存组织方式
本讲大纲
1.内存组织方式 2.堆与栈 实例1 在堆中分配内存并释放 实例2 栈在函数调用时的操作
内存组织方式
开发人员将程序编写完成之后,程序要先装载到计算机的内核或者半导体内存中,然后再运行程 序。程序被组织成4个逻辑段: 可执行代码 静态数据 可执行代码和静态数据,存储在固定的内存位置。 动态数据(堆) 程序请求动态分配的内存来自内存池,也就是上面所列举中的堆。 栈
运行程序,显示效果如图15.3所示:
图15.3 在堆中分配内存并释放 在程序中代码中,首先使用malloc分配一个整型变量的内存空间,通过指向该内存空间的指针,使用 该空间保存数据,然后使用free将整型变量的内存释放。
实例2 栈在函数调用时的操作
在本实例中,对上面栈的描述操作过程使用实例进行说明。其中函数的名称根据上面描述中所定。 来自百度文库过该实例能够更好的理解栈的操作过程。
图15.1 错误提示
栈 程序不会像处理堆那样的在栈中显示地分配内存。当程序调用函数和声明局部变量时,系统将自动
分配内存。 栈是一个后进先出的压入弹出式的数据结构。在程序运行时,是每次向栈中压入一个对象,然后栈指
针向下移动一个位置。当系统从栈中弹出一个对象时,最近进栈的对象将被弹出,然后栈指针向上移动 一个位置。如果栈指针位于栈顶,表示栈是空的;如果栈指针指向最下面的数据项的后一个位置,表示 栈为满的。其过程如图15.2所示:
在内存的全局存储空间当中,用于程序动态分配和释放的内存块称为自由存储空间,通常也称之为堆。 在C程序中,是用malloc函数和free函数来从堆中动态的分配和释放内存。 注意: 在使用malloc函数和free函数时,要加上头文件#include<stdlib.h>,否则调试程序就会出现报错,如 图15.1所示。
相关文档
最新文档