堆栈溢出和C中的无限次循环调用之间的区别

时间:2013-07-01 10:34:18

标签: c stack overflow infinite

我对堆栈溢出错误何时显示以及何时在C中无限次调用循环感到困惑!!两者是否相同,如果没有,那么两种情况之间的区别是什么。请帮忙。

5 个答案:

答案 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)"

症状:

程序崩溃。

说明:

调用函数时,会在称为堆栈的位置分配一些空间,例如局部变量,返回地址和参数。当函数返回时,此空间被释放。如果在它完成之前函数调用另一个函数,则在堆栈上为新函数分配更多内存。如果有太多嵌套函数调用(通常由深度/无限递归引起),则堆栈空间不足以存储有关所有当前调用函数的信息,并且会出现堆栈溢出。