查找素数时出现运行时错误

时间:2015-01-02 11:28:29

标签: c sieve-of-eratosthenes

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

1 个答案:

答案 0 :(得分:1)

scanf("%lld %lld",&m,&n);
prime=(int*)(malloc((n-m)*sizeof(int)))

您正在为n-m元素分配内存,并且您正在尝试访问超出绑定访问的mn-1元素,这将导致未定义的行为,因此您看到崩溃。

在同一个循环中有类似的其他访问权限,因此您应该注意这一点。

例如:

输入为5和10,即m=5n=10(格式说明符应为%lld很长时间)

现在分配的内存是5个元素prime[0]prime[4]

在for循环中,您可以访问i<n,在这种情况下,您可以访问

prime[9]会导致崩溃,因为您正在访问一些未由您分配的内存

其他访问权限

prime[j*i]如果i = 3且j = 4

,该怎么办?

您正在访问prime[12]