C 为什么在下面的代码中出现分段错误(内核转储)?

C 为什么在下面的代码中出现分段错误(内核转储)?,c,recursion,segmentation-fault,post-increment,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??! } “后增量”和“减量”运算符实际上在计算表达式后增加或减少值,这意味着在将a和b的值传递给函数后,它将更改这些值 这样,您将始终向add函数传递a和b的不变值,这将导致堆栈溢出,从而

在这段代码中,使用a-和b++显示了分段错误,但如果我给了-a和++b它的工作原理,为什么

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

“后增量”和“减量”运算符实际上在计算表达式后增加或减少值,这意味着在将a和b的值传递给函数后,它将更改这些值

这样,您将始终向add函数传递a和b的不变值,这将导致堆栈溢出,从而导致分段错误,因为这本质上是一个递归函数,永远不会满足返回条件

OTOH,如果您使用预递增或递减运算符,a和b的值将在传递给递归add调用之前减小,从而满足返回条件,因此您的程序按预期运行


这就是说,您应该指定函数的返回类型,例如,在本例中,int.

是。问题是因为您在进入函数后进行了一次增量/减量、加法或减法运算。你实际上进入了一个无休止的循环,这可能会给你一个分段错误

此外,您的函数定义是错误的

这应该是您的代码:

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

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


<> P>最有可能是你在代码中没有暴露的,导致StuttOutsRebug。

代码不是有效的C++。你能告诉我们你在用什么语言编程,粘贴错误信息是因为操作符被应用为后增量而不是预增量。当变量在堆栈上传递给递归调用时,必须首先递增变量,而不是之后递增变量,循环才能继续end@juanchopanza:它实际上也不是有效的C。这也需要一个类似于声明的原型。行不行吗?你怎么知道的?谢谢你的重播。@SouravGhosh谁知道呢,如果你读了不止一次,一条评论/答案也可能被命名为重播: