前言
在C/C++中栈区都是非常重要的一个内存区域,它管理着自己编写的函数中的局部变量、返回值,参数等。由于栈的空间有限,因此,防止栈的溢出至关重要。栈的定义在这篇文章中已经详细说明https://blog.csdn.net/m0_59951855/article/details/134111927
正文
栈溢出定义
栈溢出:使用栈内存时,向栈中写入超出其容量限制的数据,当向栈中不断压入数据,超过了栈的大小限制。栈溢出可能导致程序异常行为,包括程序崩溃,异常退出甚至安全漏洞。
产生原因
(1)、使用递归调用时,层级越深,将会调用使用给更多的栈的空间,可能造成栈溢出。例如类似下方函数,当输入n过大时,会调用很多次自身,占用较多空间
//递归计算斐波那契数
long fib(int n) {
if (n <= 2) {
return l;
else
return fib(n - 1) + fib(n - 2)
}
}
(2)、局部变量过量/过大,声明了大量的局部变量或者很大的数组。类似下方代码
int main()
{
//占用栈内存,局部变量,太大,栈溢出
double test[750][750];
return 0;
}
防止栈溢出的方法
(1)、检查递归条件,防止输入过大的参数
(2)、减少局部变量和数组的使用,可以开辟到堆区,不过不能忘记手动释放内存。
(3)、增加栈的大小
(4)、使用堆内存
总结
这里只是简单的介绍栈溢出相关的知识,在面试过程中已经可以应对,具体原理还需要详细理解。