我尝试在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;
}
答案 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,至少在我的计算机上),这对于你的计算机来说几乎是可以撤销的。