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

Rah*_*hul 2 c recursion

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

当我尝试访问无法访问的内存时,应该会发生分段错误,但在这个程序中,我没有尝试访问任何无法访问的内存。

#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;
}
Run Code Online (Sandbox Code Playgroud)

Bas*_*sya 5

您正在访问您无法访问的内存。它在代码中并不明显(就像悬空指针)。递归是很棘手的;你很容易就会溢出堆栈。堆栈主要存储进入函数时的信息(参数的寄存器或地址、调用函数和被调用函数中使用的寄存器的保存值以及返回指针(完成函数时跳转到的位置)。

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

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