Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我在下面的C代码中出现分段错误?_C - Fatal编程技术网

为什么我在下面的C代码中出现分段错误?

为什么我在下面的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;

这是一个名为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;
    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数据不在堆栈上,而是在静态存储中-它是一个全局变量。非常感谢您指出这一点。很糟糕,我自己找不到它。