1

我想知道是什么导致了以下程序中的分段错误。我认为分段错误发生在递归期间。一旦我输入一个数字,就会出现错误消息“发生访问分段错误”。

这是代码:

 #include <stdio.h>
 #include "simpio.h"

 int sum(int n);

 main()
 {
     int n, Sum;

     printf("Please enter the amount of elements in sequence n/n+1: ");
     printf("LOL1\n");
     n=GetInteger();
     Sum=sum(n);
     printf("LOL2\n");
     printf("The sum of the first %d elements of the sequence n/n+1 is: %d", n, Sum);
     printf("LOL3\n"); 
     getchar(); 
 }

 int sum(int n)
 {
     if(n=0)           return(0);
     else              return((sum(n-1))+(n/(n+1)));
 }
4

4 回答 4

7

这个功能:

int sum(int n)
{
    return (n = 0) ? 0 : (sum(n - 1)) + (n / (n + 1));
}

是一个无限循环,每次迭代都会占用堆栈空间,直到内存不足。你真的是说(n == 0)这里。在你修复它之后,你会意识到对于整数来说,(n / (n + 1))总是 0,所以函数会工作但总是返回 0。

您在这里根本不需要递归,但是您确实需要使用整数以外的东西来使该除法有意义。

于 2013-07-20T11:10:47.460 回答
5

赋值表达式(n = 0)永远不会为真:它是赋值,而不是比较。这就是为什么你的递归一直持续到你的程序溢出堆栈的原因。

您需要更改(n = 0)for(n == 0)或 C 的惯用语!n,这意味着相同的事情。

另请注意,您执行整数除法:n/(n+1)使用整数时始终为零。您需要切换到floatdouble获得非零结果。

于 2013-07-20T11:07:17.190 回答
2

将 (n=0) 更改为 (n==0)。使用 float 类型而不是 int 类型,这样我们才能正确使用除法属性。

于 2013-07-20T12:13:10.917 回答
0
if(n=0)           return(0);

这个陈述总是错误的,因此我认为是无限循环因此错误

作为输入,某些标准推荐了诸如这些的表达式

if(0 == n)           return(0);

作为在编译时查找编码错误的一种方式

于 2013-07-20T15:12:14.087 回答