0

我尝试在 spoj.pl 上提交的每个程序都会出现此错误

在给定的代码中,我需要找到 m - n 之间的素数以表示 t no。的测试用例。问题陈述:http ://www.spoj.com/problems/PRIME1/ 出现同样的错误..谁能告诉我为什么这个错误再次出现..这是我的代码

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

int main()

{
  int t;
  scanf("%d",&t);
  int *m,*n;
  m=(int *)malloc(sizeof(int)*t);
  n=(int *)malloc(sizeof(int)*t);
  int i=0;
  while(i<t)
     {
          scanf("%d%d",(m+i),(n+i));
          i++;
      }
  i=0;
  while(i<t)
    {
      long long int *list,j,k;
      list=((long long int*)malloc(sizeof(long long int)*(n[i]+1)));
      list[0]=list[1]=0;
      for(j=2;j<=*(n+i);j++)
           {
               *(list+j)=1;
           }
      float l=sqrt(*(n+i)+1);
      //int l=sqrt(*(n+i)+1);

      for(j=2;j<=l;j++)
           {
               if(*(list+j)==1)
                   {
                       //printf("\n%ld",j);
                       for(k=j*j;k<=*(n+i);k=k+j)
                           *(list+k)=0;
                    }
            }
      for(j=m[i];j<=n[i];j++)
           {
               if(*(list+j)==1)
                   {
                       printf("\n%ld",j);
                    }
            }
      printf("\n");
      free(list);
      i++;
 }
free(m);
free(n);  
return 0;
}
4

2 回答 2

2

首先——你不应该强制转换 malloc——它可能会导致意外错误。

其次,没有验证您分配了所需的内存。您在三个不同的地方请求内存并且永远不会查看 malloc 是否返回 NULL 结果...如果t和/或(n[i]+1)足够大, malloc() 可能无法获得足够大的内存块来满足请求,在这种情况下,您尝试分配一个 NULL 指针并得到一个 SIGSEGV - 问题描述中给出了提示

警告:大量输入/输出数据,请注意某些语言(尽管如果算法设计良好,大多数应该没问题)

于 2013-04-05T19:22:27.477 回答
0

似乎在我的计算机上工作正常,除了关于使用 %ld 的警告(应该使用 %lld)。将 0 作为 n[i] 的值时,我只能获得 SIGSEGV 错误。你能指出你用来产生那个错误的值吗?

编辑:您正在测试值“1 888888888 1000000000”。您的计算机根本无法分配如此大小的数组。您在内存中询问大小为 1000000001 的数组。这大约是 8GB(因为 long long int 大约是 8B,至少在我的计算机上是这样),这对您的计算机来说几乎是不可撤销的。

于 2013-04-05T19:14:56.363 回答