在此代码中,使用a--
和b++
显示了分段错误,但是如果给它--a
和++b
它的工作,为什么?!
add(a,b)
{
if (a==0)
return b;
else
return add(a--,b++); //why this line didn't work??!
}
答案 0 :(得分:5)
后期递增和递减运算符实际上在计算表达式后递增或递减值,意味着它将在传递给函数后更改a
和b
的值。
这样你最终会将a
和b
的未更改值一直传递给add ()
函数,这会导致堆栈溢出(导致分段错误),因为这是本质上是一个永远不会满足返回条件的递归函数。
OTOH,如果使用预增量或减量运算符,a
和b
的值会在传递给递归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。