为了测试,我编写了一个代码来计算素数<50。但我得到了分段错误。我通过gdb检查了代码,它显示“primes [index] = p;”是错的。但我真的不知道为什么以及如何解决它,请帮助我。非常感谢。
操作系统:Ubuntu 14.04
内核:3.19.0-33泛型
编译:GCC 4.84
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
int p, i, primes[50], index;
bool isprime;
primes[0] = 2;
primes[1] = 3;
index = 2;
for (p = 5; p <=50; p+2)
{
isprime = true;
for (i = 0; isprime && ((p/primes[i]) >= primes[i]); i=i+1)
{
if (p%primes[i] == 0)
isprime = false;
}
if (isprime == true)
{
primes [index] = p;
index = index +1;
}
}
printf ("\n");
for (i = 0; i <index; i=i+1)
{
printf("%i ", primes[i]);
}
return 0;
}
答案 0 :(得分:7)
你有一个无限循环因为这个
for (p = 5 ; p <= 50 ; p + 2)
// ^ has no effect
你的意思是
for (p = 5 ; p <= 50 ; p += 2)
我是如何快速找到这个的?
事实是我没有阅读代码,只是将其复制并粘贴在我最喜欢的文本编辑器中,然后用-Wall
编译,然后编译器告诉我
stack-overflow.c:129:5: warning: statement with no effect [-Wunused-value]
for (p = 5 ; p <=50 ; p + 2)
答案 1 :(得分:-3)
以书面形式p <=50;
,您将访问primes[50]
,该索引超出范围。
primes [49]是最后一个元素。
你的循环中需要p + = 2作为增量,否则永远不会终止。