第18课-栈与递归
C语言中的疑惑
讨论中……
小A:C语言中常说“局部变量在栈上分配空间”,那么这个地方的“栈”和我们之前学习的栈数据结构有关系吗?
小B:我觉得应该没关系吧 :我觉得应该没关系吧,只是名称碰巧一致而已吧?!
1. 函数调用时的栈
(1)程序中的“函数调用栈”是栈数据结构的一种应用。
(2)函数调用栈一般是从高地址向低地址增长的。
l 栈底为内存的高地址处。
l 栈顶为内存的低地址处。
(3)函数调用栈中存储的数据为活动记录
2. 活动记录
活动记录是函数调用时一系列相关信息的记录。
3. 函数调用过程
4. 程序中的栈
(1) 程序中的栈空间可看做一个顺序栈的应用。
(2) 栈保存了一个函数调用所需的维护信息。
(3) 函数参数,函数返回地址 ,函数返回地址。
l 局部变量。
l 函数调用上下文。
5. 栈的溢出
(1) 在不断的压栈过程中造成栈空间耗尽而产生栈溢出。
(2) 栈溢出常由于函数递归过深或局部数组过大造成。
#include <stdio.h>
void reverse(char* s)
{
if( (s != NULL) && (*s != ' ') )
{
reverse(s + 1);
printf("%c", *s);
}
}
int main()
{
reverse("12345");
printf(" ");
return 0;
}
运行结果:54321
分析:第一次的递归*s指向的是1,之后一次是2,3,4,5。这些结果一次进栈。这些的递归是以reverse(s + 1);为界限的,当所有的文件递归结束后,再让我们之前指向的数据依次出栈。所以我们看到的最后结果是54321。我们这里要明白一点,那就是递归函数是要进栈的。
小结
(1)程序栈空间在本质上是一种顺序栈。
(2)程序栈空间的访问是通过函数调用进行的。
(3)程序栈空间仍然遵从后进先出的规则。