SIGSEGV错误不断出现

时间:2013-04-05 18:56:17

标签: c sigsegv

我尝试在spoj.pl

上提交的每个程序都会出现此错误

在给定的代码中,我需要在m - n之间找到素数而不是。测试用例。 问题陈述:http://www.spoj.com/problems/PRIME1/ 出现同样的错误.. 任何人都可以告诉我为什么这个错误再次出现nd .. 这是我的代码

#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;
}

2 个答案:

答案 0 :(得分:2)

首先 - you should not cast malloc - 它可能会导致意外错误。

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

  

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

答案 1 :(得分:0)

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

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