【问题标题】:Segmentation fault core dumped : Function that returns the next prime numberSegmentation fault core dumped : 返回下一个素数的函数
【发布时间】:2021-06-10 20:06:50
【问题描述】:

我得到分段错误核心转储。我的函数应该返回传入参数之后的素数,或者如果它是素数则返回该数字。

当我编译时,我没有错误,我也用-Wall 编译,它工作。但是当我运行程序时,我得到了segmentation fault, core dumped。我看不到问题。

#include <stdio.h>

int ft_next_prime(int nb)
{
        int i = 2;
        int notPrime = 0;

        while (i++ < 9 || notPrime != 1) {
                if (nb == i)
                        i++;
                else if (nb % i == 0)
                        notPrime = 1;
        }
        return ((notPrime) ? ft_next_prime(nb++) : nb);
}

int main()
{
        printf("%d", ft_next_prime(15));
}

为什么?

另外,我可以写这个吗?

while (i++ < 9 || !notPrime)
    if (nb % (i != nb) == 0)
        notPrime = 1;

【问题讨论】:

    标签: c recursion segmentation-fault primes core


    【解决方案1】:

    使用以下行代替您的退货声明:

    return ((notPrime)? ft_next_prime(nb+1) : nb);
    

    分段错误有几个不同的原因。在您的情况下,您的堆栈空间不足。

    ft_next_prime(nb++) 行执行并返回 ft_next_prime(nb) — 具有完全相同的参数 — 然后增加 nb — 毫无意义,但这正是您告诉它要做的。

    【讨论】:

      【解决方案2】:

      其他答案未能指出:

      问题是你有两个无限循环来源

      1) 无限循环:

      while(i++ < 9 || notPrime != 1)
      

      通过使用|| notPrime != 1,您将迭代直到i++ &lt; 9 为假且notPrime 为实际1。换句话说,您将迭代直到if(nb % i == 0) 评估为真并且变量notPrime 设置为1;

      因此,在通话中

      return ((notPrime)? ft_next_prime(nb++) : nb);
      

      它总是会一次又一次地递归调用ft_next_prime。因此,最终导致Segmentation fault 的无限循环。

      你的意思其实是while(i++ &lt; 9 &amp;&amp; notPrime != 1)

      2) 此外,ft_next_prime(nb++) 应替换为 ft_next_prime(nb+1),否则您调用的递归函数始终具有相同的值。


      您遇到的其他问题是查找素数的逻辑。一个number is prime:

      素数(或素数)是大于 1 的自然数,即 不是两个较小自然数的乘积。

      你在i++ &lt; 9 停止检查,这是没有意义的,因为 143 = 11 * 13 不是素数,因为它可以被 11 和 13 整除。你至少需要检查直到 nb / 2(实际上还有更好的下界我留给你找)。


      一个可能的解决方案:

      #include <stdio.h>
      
      int ft_next_prime(int nb){
              int notPrime = 0;
              for(int i = 2; i < nb / 2 && !notPrime; i++)
                  notPrime = nb % i == 0;
              return notPrime ? ft_next_prime(nb + 1) : nb;
      }
      
      int main() {
           printf("%d", ft_next_prime(15));
      }
      

      【讨论】:

      • 谢谢。我仍然不明白为什么for(int i = 2; i &lt; nb/2 || !notPrime; i++) 不起作用。因为在我的理解中,要跳出这个循环,你需要检查所有的数字并且这个数字必须不是素数。但是我正在寻找一个素数,因此当计算机找到一个素数时,它将如何跳出循环?
      • @Noaah 是的,所以当 i 小于 nb/2 (i
      【解决方案3】:

      “分段错误”表示您试图访问您无权访问的内存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-22
        • 2019-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多