Segmentation fault core dumped : returns 下一个质数的函数

Segmentation fault core dumped : Function that returns the next prime number

我得到了分段错误核心转储。我的函数应该 return 跟在输入参数后面的素数,或者 return 如果它是素数的话。

我编译的时候没有报错,我也是用-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;

“分段错误”意味着您试图访问您无权访问的内存。

使用以下行代替您的 return 语句:

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

分段错误有几种不同的原因。在你的例子中,你在堆栈中 space 中 运行。

ft_next_prime(nb++) 执行并且 returns ft_next_prime(nb) - 使用完全相同的参数 - 然后递增 nb - 毫无意义但这正是你告诉它的做。

其他回答都没有指出:

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

1) 无限循环:

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

通过让 || notPrime != 1 您将迭代直到 i++ < 9 为假并且 notPrime 实际为 1。换句话说,您将迭代直到 if(nb % i == 0) 计算为真并且设置了变量 notPrime到 1;

因此,在通话中

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

它总是会递归调用 ft_next_prime 一次又一次。因此,最终导致 Segmentation fault.

的无限循环

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

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


你遇到的其他问题是求素数的逻辑。一个 number is prime :

A prime number (or a prime) is a natural number greater than 1 that is not a product of two smaller natural numbers.

你在 i++ < 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));
}