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));
}
我得到了分段错误核心转储。我的函数应该 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));
}