我对堆栈溢出错误何时显示以及何时在C中无限次调用循环感到困惑!!两者是否相同,如果没有,那么两种情况之间的区别是什么。请帮忙。
答案 0 :(得分:4)
对不终止的函数的递归调用肯定会导致堆栈溢出。但并非每个堆栈溢出都是由没有基本情况的递归调用引起的。
例如,为庞大的本地阵列分配存储也很可能导致堆栈溢出。
我的机器出现以下故障并出现分段错误(由于我的分配超出了堆栈的大小,我可能尝试访问不属于我程序的内存):
#include <stdio.h>
int main()
{
int arr[1000 * 1000 * 100];
arr[99999999] = 0;
printf("%d\n", arr[99999999]);
return 0;
}
无限循环,而无法恢复的东西不会自动导致堆栈溢出(如果你只是调用for(;;) { int i = 1; }
这本身就不是堆栈溢出)。
答案 1 :(得分:2)
叠加流量,但无限循环意味着你有一个循环,你的程序永远不会跳出它。
答案 2 :(得分:1)
在循环永远不会停止时,c循环被称为无限。堆栈是不同的东西。处理器使用堆栈存储器临时存储数据。请注意,所有局部变量,数组等都存储在堆栈中。当您在堆栈上存储太多变量时,它可能会超出堆栈内存的容量,此时堆栈被称为溢出。 由于无限循环,堆栈可能会溢出但不是所有时间。 阅读:http://en.wikipedia.org/wiki/Stack_overflow
答案 3 :(得分:1)
当你调用另一个函数时,你正在使用堆栈 - 你在那里放置新函数的局部变量,以及一个返回地址(一般来说;这取决于架构和实现)。这样做太多了,你的堆栈耗尽,溢出它。
当你保持循环时,你不会添加到堆栈中。
答案 4 :(得分:1)
示例:的
while (1 + 1 == 2) { /* do something */ }
症状:
程序冻结或不会停止运行。
说明:
条件总是如此,所以身体一次又一次地被执行......
示例:的
int stackOverflow(int x)
{
if (x == 0) return 1;
return x * stackOverflow(x - 1);
}
stackOverflow(4); // returns 24
stackOverflow(-1); // crashes with "Segmentation fault (core dumped)"
症状:
程序崩溃。
说明:
调用函数时,会在称为堆栈的位置分配一些空间,例如局部变量,返回地址和参数。当函数返回时,此空间被释放。如果在它完成之前函数调用另一个函数,则在堆栈上为新函数分配更多内存。如果有太多嵌套函数调用(通常由深度/无限递归引起),则堆栈空间不足以存储有关所有当前调用函数的信息,并且会出现堆栈溢出。