为什么我在下面的C代码中出现分段错误?
这是一个名为prime1的spoj的问题。代码对我来说似乎是正确的。这甚至可以在ideone.com上运行并产生理想的结果,但spoj给了我一个运行时错误,说这是一个分段错误。我找不到任何内存泄漏、缓冲区溢出等。请帮助我查找分段故障为什么我在下面的C代码中出现分段错误?,c,C,这是一个名为prime1的spoj的问题。代码对我来说似乎是正确的。这甚至可以在ideone.com上运行并产生理想的结果,但spoj给了我一个运行时错误,说这是一个分段错误。我找不到任何内存泄漏、缓冲区溢出等。请帮助我查找分段故障 #include <stdio.h> unsigned int arr[32200]; int prime() { unsigned int i,j,k=2; int flag; arr[0]=2; arr[1]=3;
#include <stdio.h>
unsigned int arr[32200];
int prime()
{
unsigned int i,j,k=2;
int flag;
arr[0]=2;
arr[1]=3;
for (i=5;i<32200;i+=2)
{
flag=0;
for(j=3;j<i;j+=2)
{
if(i%j==0)
{
flag=1;
break;
}
}
if (flag==0)
{
arr[k++]=i;
}
}
return 0;
}
int main()
{
int t;
unsigned int a,b,i,m;
scanf("%d",&t);
prime();
while(t--)
{
scanf("%u%u",&a,&b);
for(i=0;;i++)
{
if (arr[i]>=a)
{
m=i;
break;
}
}
while(arr[m]<=b)
{
printf("%u\n",arr[m]);
m++;
}
printf("\n");
}
return 0;
}
#包括
无符号整数arr[32200];
int素数()
{
无符号整数i,j,k=2;
int标志;
arr[0]=2;
arr[1]=3;
对于(i=5;i如果给定的a
大于arr
中的所有元素,则main()中的第一个for()
循环
溢出数组,产生未定义的行为。全局变量arr
将被初始化为零这一事实有助于触发此情况:从零以外的任何a
开始,立即出现未定义的行为。保留素数的数组太小
作为b
可以拥有的最大数量是10^9
,而a
的最小数量是1。因此,您需要存储10到10亿之间的所有素数
例如,如果您在wolfram alpha中键入“1到100000000之间有多少素数”,您将得到这两个素数之间有50847534
素数。因此,您的数组太小
另外,在你解决这个问题之后,你会得到一个TLE。你的代码对于这个问题来说效率太低了。你需要开发一种更快的方法来生成素数。这个程序做什么?你能缩进它并给变量有意义的名称吗?我可以建议打印一些变量吗?比如t,a,b,I,m,k,j错误的值可能导致seg故障。但是,在我不知道这些是什么或代码的用途的情况下,我无法告诉你它们是否会错误。这个程序是为计算机编写的,不是为人类编写的。我想它的目的是训练人们像状态机一样工作,我不想这样做。约翰·库格曼是完全正确。分析如此糟糕的代码既没有意义也没有乐趣。与其将大量数据放在堆栈上(32200 int),不如使用malloc和friends。@FredrikPihl数据不在堆栈上,而是在静态存储中-它是一个全局变量。非常感谢您指出这一点。很糟糕,我自己找不到它。