具有递归功能的Segfault

时间:2014-08-29 14:04:13

标签: c

#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);
}

上面的示例递归程序给出了段错误。无法理解为什么会发生段错误,因为没有涉及指针。

6 个答案:

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