函数调用时的栈
程序中的“函数调用栈”是栈数据结构的栈的一种应用。
函数调用栈一般是从高地址向低地址增长的:
栈底为内存的高地址处
栈顶为内存的低地址处
函数调用栈中存储的数据为活动记录。
活动记录是函数调用时一系列相关信息的记录:
注意: 程序中的栈空间可看做一个顺序栈的应用。
栈保存了一个函数调用所需的维护信息:
- 函数参数,函数返回地址
- 局部变量
- 函数调用上下文
递归与栈的关系
因为程序中的栈结构是顺序栈,因此,如果递归的次数过多,程序中的数据过大,在不断的压栈过程中造成栈空间耗尽而产生栈溢出。
栈溢出常由于函数递归过深或局部数组过大造成。
递归应用举例:
#include <stdio.h>
void reverse(char* s)
{
if( (s != NULL) && (*s != '\0') )
{
reverse(s + 1);
printf("%c", *s);
}
}
int main()
{
reverse("12345");
printf("\n");
return 0;
}
程序的输出结果是:54321. 这是递归的作用
小结
程序栈空间在本质上是一种顺序栈
程序栈空间的访问是通过函数调用进行的
程序栈空间仍然遵从后进先出的规则