繁体   English   中英

为什么我的递归函数会导致分段错误?

[英]Why does my recursive function cause a segmentation fault?

在以下代码中,我试图解决河内塔楼问题。 为什么会出现分段错误(核心转储)?

当我尝试访问无法访问的内存时应发生分段错误,但在此程序中我未尝试访问任何无法访问的内存。

#include <stdio.h>
#include <stdlib.h>

void steps(int n, int t, int p)
{
    int i, k = 6 - (p + t);

    if (n == 1) {
        printf("%d-->%d\n", n, t);
    }

    for (i = 0; i < 2; ++i) {
        if (i == 0) {
            steps(n - 1, k, p);
            printf("%d-->%d\n", n, t);
        } else {
            steps(n - 1, t, k);
        }
    }
}

int main()
{
    int n;
    printf("Enter the value of n: ");
    scanf("%d", &n);
    steps(n, 3, 1);
    return 0;
}

您正在访问无法访问的内存。 它只是在代码中并不明显(就像悬空的指针一样)。 递归很棘手; 您可以轻松地使堆栈溢出。 基本上,当您输入一个函数时,堆栈会存储信息(参数的寄存器或地址,在调用函数和被调用函数中使用的寄存器的保存值以及返回指针(完成函数时将跳转至的位置))。

堆栈具有一定的大小。 它可能很大,但是是有限的。 在递归中,您不断从自身内部调用相同的函数。 如果这种情况发生太多次,您将“溢出堆栈”-也就是说,尝试在堆栈已满时将更多信息“推送”到堆栈上,这意味着在堆栈末尾的地址处-内存您可能无法访问。 (如果您确实有权访问它,则可能会覆盖其中一个或某些此类变量。)

递归足够远后,必须从函数中返回,而无需再次调用它。 可能在您的n == 1“ if”中。

在递归的基本情况下,您没有任何return语句,因此您的代码将无限期地运行(超过了时间限制),您应该尝试执行以下操作:

if(n==1)
{
    printf("%d-->%d\n", n, t);
    return ;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM