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

时间:2014-07-07 20:09:20

标签: 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;
    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;
}

2 个答案:

答案 0 :(得分:2)

如果a的值大于arr中的所有元素,则for()中的第一个main()循环会超出数组,从而产生未定义的行为。全局变量arr初始化为零的事实有助于触发此条件:从零以外的任何a开始,并且您立即有未定义的行为。

答案 1 :(得分:0)

你保持素数的阵列太小了。

b的最大数量为10^9a的最小数量为1.因此,您需要存储1到10亿之间的所有素数。

例如,如果在wolfram alpha中键入“1到1000000000之间有多少素数”,您将得到这两者之间存在50847534个素数。所以你的阵列太小了。

此外,在您修复之后,您将获得TLE。您的代码对于此问题来说效率太低。您需要开发一种更快的方法来生成素数。