【问题标题】:What is the cause of Access Segmentation Fault in CC中访问分段错误的原因是什么
【发布时间】:2013-07-19 15:33:22
【问题描述】:

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

代码如下:

 #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)));
 }

【问题讨论】:

  • 请出示您的GetInteger
  • 另外,您的 sum(int n) 函数中有一个错误。你应该有 if(n == 0)
  • n=0 --> n==0
  • 请注意,n/(n+1) 在使用整数运算时始终为 0,因此您的函数将始终返回 0。
  • 3/4 = 0 使用整数 - 也许你应该使用浮点数?

标签: c recursion segmentation-fault


【解决方案1】:

这个函数:

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

是一个无限循环,每次迭代都会占用堆栈空间,直到内存耗尽。你真的是指(n == 0) 这里。修正后,您会发现对于整数,(n / (n + 1)) 始终为 0,因此该函数将工作但始终返回 0。

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

【讨论】:

  • 非常感谢,我忘记了整数的除法属性:)
【解决方案2】:

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

你需要把(n = 0)改成(n == 0)或者C的惯用!n,意思是一样的。

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

【讨论】:

  • 谢谢,但现在我解决了这个问题,你知道为什么它一直打印 0 吗?
  • @C_Beginner_Learner 因为整数除法。
  • 我已经在上面的cmets中解释了整数运算。
  • n / (n + 1) 对于整数将始终为 0。
  • @PHIfounder 一旦 OP 修复了 === 的问题,将执行整数除法并返回零。
【解决方案3】:

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

【讨论】:

    【解决方案4】:
    if(n=0)           return(0);
    

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 2011-01-19
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      相关资源
      最近更新 更多