该代码用于检查用户输入的号码是否为素数。我正在cygwin终端上执行程序,每当我运行它并输入一个数字时,它会说:“Segmentation fault(core dumped)”。有什么建议吗?
#include <stdio.h>
int prime(int num, int i, int count);
void main()
{
int num, i=2, count=0, result;
printf("Please enter a number: ");
scanf("%d", &num);
result = prime(num, i, count);
if (result != 0)
printf("num is not a prime number");
else
printf("num is a prime number");
}
int prime(int num, int i, int count)
{
if (i < num)
{
if (num%i == 0)
{
count++;
prime(num, i++, count);
}
else
prime(num, i++, count);
}
return count;
}
答案 0 :(得分:4)
您在函数参数中使用帖子increment i++
。绝对没有任何作用。因为后增量在执行后发生。
因此,您的i
变量永远不会增加,并进行无限递归,从而为您提供segmentation fault。
您可以使用预先增加++i
或使用i+1
调用函数来修复它。
int prime(int num, int i, int count)
{
if (i < num)
{
if (num%i == 0)
{
count++;
prime(num, ++i, count);
}
else
prime(num, ++i, count);
}
return count;
}
答案 1 :(得分:2)
分段错误是一种特殊的错误,它是由访问“不属于你”的内存引起的。它是一种帮助机制,可以防止破坏内存并引入难以调试的内存错误。每当你得到一个段错误时,你就知道你正在做一些错误的内存 - 访问已经被释放的变量,写入内存的只读部分等。在大多数语言中,分段错误本质上是相同的,让你搞砸了在内存管理方面,C和C ++中的段错误没有任何主要区别。
有很多方法可以获得段错误,至少在C(++)等低级语言中。获取段错误的常用方法是取消引用空指针:
更好地浏览这些链接: What is a segmentation fault?
答案 2 :(得分:0)
使用递归打印质数
公共类 PrimeNumberUsingRecursionFun {
static int count = 0, i = 1, j = 1, n = 2;
public static void prime() {
if (i < 100) {
if (n % j == 0) {
count++;
j++;
} else if (count == 2 && j > n) {
System.out.print(n + " ");
n++;
j = 1;
count = 0;
i++;
}
else if (count == 1 && j < n) {
j++;
}
else if(count >= 2) {
j = 1;
count = 0;
i++;
n++;
}
prime();
}
}
public static void main(String[] args) {
prime();
}
}