递归函数导致段错误

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

上面的递归程序会导致段错误。没有涉及指针,不明白为什么会出现段错误。

2
你的递归函数的基本情况在哪里? - haccks
4
这是一个无限循环... - ThreeFx
4
“无法理解为什么会出现段错误,因为没有涉及指针。” - 那...那...那...就是无稽之谈。 - The Paramagnetic Croissant
2
@levi; 我不认为这个返回值有什么用。 - haccks
3
这句话的意思是“胡说八道,因为if语句的条件总是被满足的”,需要注意的是,原文中的“if-branch”指的是if语句的执行分支。 - ThreeFx
显示剩余7条评论
6个回答

11

你的代码中存在无限递归。因为 c 从未等于 105(每次进入函数时都被设置为 100),所以函数将不断地调用自身,直到堆栈溢出(超过其容量)。

它简化为如下:

int blowUpStack (int a) {
    blowUpStack (a);
}

9

段错误的原因是栈溢出 :).

栈会填充函数返回地址和本地栈,直到主栈指针达到栈段边界。


2
你的答案 = 完美胜利。 - levi

7

您的变量c永远不会大于101,每次调用函数时它都会被重置为100,然后增加一次。


7

段错误不仅限于指针。在这种情况下,您的函数调用堆栈将穿过可寻址的内存,直到咬住一些不属于您的内存为止。砰。

至于为什么,这里有一个提示:c在每个函数调用中都是一个不同的变量,因此仅仅对其进行递增对下一个变量没有影响。


4

由于你的c变量不是静态的,所以每次都会调用recursive函数,并始终使用100重新初始化它,因此你的程序将永远无法停止,并最终因栈溢出而崩溃。我想你的意思是每次递归调用时 c 都应该增加一个单位?那么你需要更改它的声明:

static int c = 100;

几个人都提到过:“你需要一个基本情况”,如果c是静态的,你会得到它。但在这种情况下,它永远不会再次设置为100,所以你只能使用一次带有预期行为的函数。

3
通常情况下,当您尝试访问未分配给您的任何内存地址时,会发生“段错误”。这与您是否使用指针无关。
在这个问题中,您的递归永远不会结束,因为函数中没有基本情况来退出。因此,无限的递归调用将导致堆栈溢出,因此您的程序可能会访问未分配的内存地址。
在这种情况下,您可能希望“c”在先前的调用中保留其值,因此您需要将其声明为“static”。

@MartinJames:很好的观点,但如果OP在尝试实现后遇到问题并询问,那么可以向他解释。现在不需要解释。 - 0xF1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接