我们知道,栈溢出通常是因为递归调用层次太深导致,那么为什么递归调用层次太深回导致栈溢出呢,解决这个问题
之前我们先看一下与函数调用有关的栈的基本概念:
1. 每一个线程拥有一个调用栈结构(call stack),调用栈存放该线程的函数调用信息
2. 程序中每一个未完成运行的函数对应一个栈帧(stack frame),或者一个更响亮的名字,过程的活动记录,栈帧
中保存函数局部变量、传递给被调函数参数等信息
3. 栈底对应高地址,栈顶对应低地址,栈由内存高地址向低地址生长
对于下面这段代码:
1 void f(int a) { 2 printf("%d\n", a); 3 } 4 void g() { 5 int a = 2; 6 f(a); 7 }
当程序运行到进入printf时,对应的调用栈(模拟)是这样的:
可以看到,正常的函数调用会使栈帧指针向下增长,而每个进程的调用栈大小都有一个限制,当调用层次过深导致栈帧
指针越过调用栈的下界时,就是导致栈溢出. 因此我们写递归调用的代码时千万要注意,尽量保证递归调用的层次不要
太深!!!再一个就是不要在栈上定义太大的数组!!!
1. 下界溢出