C中访问分段错误的原因是什么?

时间:2013-07-20 10:54:34

标签: c recursion segmentation-fault

我想知道在以下程序中导致分段错误的原因。我认为在递归过程中会发生分段错误。输入数字后,会出现错误消息“发生访问分段错误”。

以下是代码:

 #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 个答案:

答案 0 :(得分:7)

此功能:

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

是一个无限循环,在每次迭代时占用堆栈空间,直到内存耗尽。你的意思是(n == 0)。解决之后,您将意识到对于整数,(n / (n + 1))始终为0,因此该函数将起作用但始终返回0.

这里根本不需要递归,但你需要使用除整数之外的其他东西来使该分区有意义。

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

if(n=0)           return(0);

此语句始终为false,因此无限循环因此错误我认为

作为输入,某些标准建议使用这些表达式

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

作为在编译时发现编码错误的一种方法