Spoj问题 -
http://www.spoj.com/problems/PRIME1/
代码中存在逻辑错误,但未运行。
的 IDE -Codeblocks
int main()
{
int t,*prime;
long long int m,n,i,j;
//t for number of test cases
scanf("%d",&t);
for(i=0;i<t;i++)
{
scanf("%llu%llu",&m,&n);
prime=(int*)(malloc((n-m)*sizeof(int)));
//Initialising all elements as 1
for(i=0;i<m;i++)
{
prime[i]=1;
}
prime[0]=0;
prime[1]=0;
//Initialising all the multiples of primes as 0 as in sieve algorithm
for(i=m;i<n;i++)
{
if(prime[i]!=0){
for(j=2;j*i<=1000000000;j++)
{
prime[j*i]=0;
}
}
}
for(i=m;i<n;i++)
{
printf("%llu\n",i);
}
free(prime);
}
return 0;
}
答案 0 :(得分:1)
scanf("%lld %lld",&m,&n);
prime=(int*)(malloc((n-m)*sizeof(int)))
您正在为n-m
元素分配内存,并且您正在尝试访问超出绑定访问的m
到n-1
元素,这将导致未定义的行为,因此您看到崩溃。
在同一个循环中有类似的其他访问权限,因此您应该注意这一点。
例如:
输入为5和10,即m=5
和n=10
(格式说明符应为%lld
很长时间)
现在分配的内存是5个元素prime[0]
到prime[4]
。
在for循环中,您可以访问i<n
,在这种情况下,您可以访问
prime[9]
会导致崩溃,因为您正在访问一些未由您分配的内存
其他访问权限
prime[j*i]
如果i = 3且j = 4
您正在访问prime[12]