C SPOJ#2分段故障(SIGSEGV)

C SPOJ#2分段故障(SIGSEGV),c,sieve-of-eratosthenes,C,Sieve Of Eratosthenes,我试过了。我就是想不出哪条线路是故障的根源。 试图通过“埃拉托斯坦筛”来解决这个问题 #include<stdio.h> int main() { unsigned long long int i,j,LIMIT,NUM1; // NUM1 and LIMIT are the starting numbers of the range //like for prime numbers between 31-100 NUM1 = 31 and LIMIT = 100

我试过了。我就是想不出哪条线路是故障的根源。 试图通过“埃拉托斯坦筛”来解决这个问题

#include<stdio.h>
int main()
{

    unsigned long long int i,j,LIMIT,NUM1; 

// NUM1 and LIMIT are the starting numbers of the range
//like for prime numbers between 31-100 NUM1 = 31 and LIMIT = 100

    int *primes;
    int z = 1,t;

    scanf("%d",&t);
    while(t--){

    scanf("%lld",&NUM1);
    if(NUM1==1)
        ++NUM1;
    scanf("%lld",&LIMIT);

    primes = malloc(sizeof(int)*(LIMIT));

    for(i=2; i<=LIMIT;i++)      //initialise every element by 1
        primes[i] = 1;

    for (i=2;i<LIMIT;i++)
    {
        if (primes[i])
    for(j=i;j*i<=LIMIT;j++)
        primes[i*j]=0;          // make 0 all elements that are factor of 'j'
    }

    for (i=NUM1;i<=LIMIT;i++)
    {

        if(primes[i])
            printf("%d\n",i);   
// prime[i] will be one for leftover elements which are prime
    }
}
    return 0;
}
#包括
int main()
{
无符号长整型i,j,极限,NUM1;
//NUM1和LIMIT是范围的起始编号
//与31-100 NUM1=31和LIMIT=100之间的素数类似
int*素数;
intz=1,t;
scanf(“%d”、&t);
而(t--){
scanf(“%lld”&NUM1);
如果(NUM1==1)
++NUM1;
scanf(“%lld”、&LIMIT);
素数=malloc(sizeof(int)*(LIMIT));
对于(i=2;i
primes=malloc(sizeof(int)*(LIMIT));

对于(i=2;imalloc(sizeof(int)*(LIMIT+1)),这是一个正确的选择吗?我尝试了它,但仍然存在运行时错误。是的,但是如果您尝试分配太多内存,malloc将返回NULL。您也应该检查它。请参阅我的编辑以获得答案。
primes = malloc(sizeof(int)*(LIMIT));

for(i=2; i<=LIMIT;i++)      //initialise every element by 1
    primes[i] = 1;
primes = malloc(sizeof(int)*(LIMIT+1));

if (primes==NULL) {
    fprintf(stderr, "Can't allocate that much space\n";
    exit(1);
}
for(i=2; i<=LIMIT;i++)      //initialise every element by 1
    primes[i] = 1;