欢迎来到天天文库
浏览记录
ID:25646640
大小:68.50 KB
页数:12页
时间:2018-11-21
《c程序设计课程中的堆与栈》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、C程序设计课程中的堆与栈谌卫军(清华大学计算机科学与技术系,北京100084)摘要:堆和栈是C语言程序设计课程中的两个重要概念,在程序设计和代码分析中应用广泛。文章首先介绍程序运行时的内存空间分布,包括代码区、全局变量区、栈和堆,然后讨论栈的基本原理和特点以及栈在函数调用执行过程中的应用,然后通过例子演示栈在代码分析中的作用,详细阐述在递归函数调用的执行过程中控制流和数据流的变化过程,最后介绍堆的基本概念和应用特点。.jyqkail protected]。0引言在讲授C语言程序设计课程时,教师会碰上两个颇
2、有挑战性的概念:堆(heap)与栈(stack)。一方面,这两个概念非常重要,在程序设计和代码分析中经常要用到,只有理解了这两个概念,才能对程序运行时的一些规律和特点有着更深刻的认识;另一方面,这两个概念又有一定的难度,涉及程序设计课程以外的一些知识,如操作系统和编译原理等,因此教师不太好讲授这部分内容,学生也不太容易理解。从大的方面来说,堆和栈实际上是属于操作系统课程的内容,描述的是一个进程的内存空间分布情况。所谓进程,即一个程序的一次运行。当磁盘上的一个可执行程序运行时,它就会被装入到计算机的内存,在内存中运行
3、。一般来说,进程的内存空间分布情况如图1所示。从图1可以看出,当一个可执行程序(EXE文件)被装入到内存时,它主要包括两个部分:代码和数据。对于代码,它会被装入到内存中的代码区,这部分内容是只读的,不能被修改。对于数据,它又由3部分组成:①全局变量:根据其是否有初始值,被装入到内存中的未初始化数据区和初始化数据区;②局部变量:在函数调用发生时存放在栈中;③动态内存空间:在程序运行时申请的动态内存空间存放在堆中。代码区和全局变量区也称为静态区域,这是因为在装入这个可执行程序时,这部分内容的大小是已知、固定的,而栈和堆
4、称为动态区域,这是因为这部分内容的大小是动态可变的。1栈(stack)栈本质上是一种数据结构,其特点是后进先出。打个比方,教室中靠墙的一排座位,学生在进去时只能从靠过道的那一侧进去,一个接一个往里走,先进去的人靠着墙坐,后进去的人靠着过道坐,但是在出来的时候却是按照相反的顺序,靠过道的学生先出来,然后才是靠墙的学生,这就是后进先出的特点。在程序运行过程中,栈主要有两个用途:一是用作暂存功能,用来保存程序运行时的上下文信息,即各个CPU寄存器的值;二是在函数调用发生时用来保存被调用函数的局部变量和形参。对于前者,主要
5、体现在汇编语言级别,因此在学习C语言时不必关注,文中主要考察后者。1.1函数调用的执行过程在C语言中,当一个函数被调用时,其执行过程如下:①在内存的栈空间中为其分配一个栈帧,用来存放该函数的形参和局部变量;②将实参的值复制给相应的形参变量;③控制流转移到该函数的起始位置;④该函数开始执行;⑤控制流和返回值返回到函数调用点,栈帧释放。1voidmain()2{3intnum;4printf("请输入一个整数:");5scanf("%d",num);6printf("%d",Times2(num));7}8intTim
6、es2(intvalue)9{10return(2*value);11}例如,对于上述程序,在它的执行过程中,栈帧的变化情况如图2所示。当main函数被执行时,在栈当中为它分配一块栈帧,用来存放它的局部变量num。然后,当执行到该程序的第6行时调用Times2函数,因此在栈当中又为这次函数调用分配一块栈帧,用于存放它的形参value。接下来,进行参数传递,将实参num的值传给形参value,然后控制流跳转到第8行Times2函数的起始地址,并开始逐条语句执行。当Times2函数执行完成后,其栈帧被释放,栈帧中的变量
7、也不能再访问。在了解了函数调用的执行过程以及栈帧的原理后,学生就会对C语言程序有更深入的理解,对于一些C语言的语法,不仅能知其然,还能知其所以然。在C语言的语法中,局部变量具有如下特点:①局部变量只在本函数范围内有效;②在不同函数中可使用相同名字的局部变量;③形参也是局部变量,也只能在本函数中使用;④局部变量的生存期:当函数被调用时,其局部变量才被创建并分配相应内存空间;当函数调用结束后,局部变量即消亡,其空间被释放。局部变量之所以具有上述这些特点,根本原因就是栈帧的工作原理。需要指出的是,在函数调用的执行过程中,
8、栈帧的申请和释放由系统自动完成,程序员并不知晓。具体来说,编译器在编译源代码时,会在函数定义所在的位置加入一些汇编指令,将栈指针(stackpointer,SP)移动到合适的位置,从而创建栈帧并为形参和局部变量分配空间。1.2代码分析栈帧的原理还可以用来进行代码分析,例如,对于下列程序:voidsp;temp=x;x=y;y=temp;}voidmain()
此文档下载收益归作者所有