在下面的代码中,我试图解决河内塔问题。为什么我会遇到分段错误(核心转储)?
当我尝试访问无法访问的内存时,应该会发生分段错误,但在这个程序中,我没有尝试访问任何无法访问的内存。
#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)
您正在访问您无法访问的内存。它在代码中并不明显(就像悬空指针)。递归是很棘手的;你很容易就会溢出堆栈。堆栈主要存储进入函数时的信息(参数的寄存器或地址、调用函数和被调用函数中使用的寄存器的保存值以及返回指针(完成函数时跳转到的位置)。
堆栈有一定的大小。它可能很大,但它是有限的。在递归中,您不断从其内部调用相同的函数。如果这种情况发生太多次,您将“堆栈溢出”——也就是说,当堆栈已满时,尝试将更多信息“推”到堆栈上,这意味着在超出堆栈末尾的地址处——内存您可能无法访问。(如果您确实有权访问它,您可能会覆盖您的变量之一或类似的变量。)
当您递归得足够远时,您必须从函数返回而不再次调用它。可能在你的n==1“if”中。
| 归档时间: |
|
| 查看次数: |
1821 次 |
| 最近记录: |