#include<stdio.h>
int recursive(int f,int g){
static int a;;
static int b;
int c = 100;
a = f;
b = g;
if(c != 105){
a++;
b++;
c++;
recursive(a,b);
}
printf("\n a : %d b : %d \n",a,b);
return 0;
}
int main(){
int a = 10;
int b = 1;
recursive(a,b);
}
上面的示例递归程序给出了段错误。无法理解为什么会发生段错误,因为没有涉及指针。
答案 0 :(得分:11)
你有无限的递归。因为c
永远不会等于105
(每次进入函数时都设置为100
),该函数将一直反复调用自身,直到你炸掉堆叠(超过其容量)。
归结为简单的事情:
int blowUpStack (int a) {
blowUpStack (a);
}
答案 1 :(得分:9)
段错误的原因是堆栈溢出:)。
堆栈由函数返回地址和本地堆栈填充,直到主堆栈指针到达堆栈段的边界。
答案 2 :(得分:7)
您的变量c永远不会大于101,每次调用该函数时它都会重置为100,然后递增一次。
答案 3 :(得分:7)
Segfaults不会只发生指针。在这种情况下,你有无限的递归,而段错误是你的函数调用堆栈通过你的可寻址内存,直到它咬你的一些不是。吊杆。
至于原因,这里有一条线索:c
在每个函数调用中都是一个不同的变量,所以仅增加它对下一个函数没有影响。
答案 4 :(得分:4)
由于您的c
变量不是静态变量,您将一次又一次地调用recursive
,始终使用100
重新初始化它,因此您的程序将永远不会停止并最终因为堆栈溢出。我想你的意思是c
每次递归调用函数时递增?然后你需要改变它的声明:
static int c = 100;
(这是其他几个人提到的:“你需要一个基本案例”,如果c
是静态的,你就会得到它。)
但是在这种情况下,它永远不会再被设置为100,所以你只能使用你的(可能的)预期行为一次。
答案 5 :(得分:3)
当您尝试访问未分配给您的任何内存地址时,通常会发生Seg Fault。它不取决于你是否使用指针。
在这个问题中,你的递归永远不会结束,因为函数中没有基本情况可以退出。因此,无限递归调用将导致堆栈溢出,因此您的程序可能会访问未分配的内存地址。
在这种情况下,您可能希望c
在之前的调用中保留其值,因此您需要将其声明为static
。