为什么我在以下代码中遇到分段错误(核心转储)?

时间:2015-08-30 12:51:56

标签: c recursion segmentation-fault post-increment

在此代码中,使用a--b++显示了分段错误,但是如果给它--a++b它的工作,为什么?!

add(a,b)
{ 
   if (a==0)
       return b;
    else
       return add(a--,b++); //why this line didn't work??! 
}

3 个答案:

答案 0 :(得分:5)

后期递增和递减运算符实际上在计算表达式后递增或递减值,意味着它将在传递给函数后更改ab的值。

这样你最终会将ab的未更改值一直传递给add ()函数,这会导致堆栈溢出(导致分段错误),因为这是本质上是一个永远不会满足返回条件的递归函数。

OTOH,如果使用预增量或减量运算符,ab的值会在传递给递归add ()调用之前降低,从而满足{return 1}} condition,因此你的程序按预期运行。

也就是说,你应该指定一个函数的返回类型,例如,在这种情况下,int

答案 1 :(得分:2)

是的,问题是因为你做了一个增加/减少的后期,加入或减去后进入函数。你实际上进入了一个无限循环,可能会给你一个分段错误。

另外,你的功能定义是错误的。

这应该是你的代码:

int add(int a,int b)
{ 
   if (a==0)
       return b;
    else
       return add(--a,++b);
       //or
       //return add(a-1,b+1);    
}

答案 2 :(得分:1)

分段错误与访问分配边界之外的内存有关。目前,您的函数将导致StackOverflow,因为无休止地调用add函数,直到无法再进一步推送堆栈指针。

在您的代码中,很可能还有其他一些您未在此处公开的内容,导致SegmentationFault。

相关问题