0

我正在编写一小段代码,它会为一组生成两个数字之间的所有素数。我决定使用筛子(而且我知道可能有一种比我的代码使用它的方式更有效的方法来做我想做的事),并且由于某种原因,我得到了一个 SIGSEGV(分段错误)。我已经看了很多遍,我不知道出了什么问题。我无法在本地机器上重现该错误。我得到这个错误通常发生在访问越界时,但我不知道这里是否是这种情况。温柔点,我对 C 语言很陌生,总是坚持使用更高级别的东西。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char argv){
    int numberOfSets;
    scanf("%d", &numberOfSets);


    int i;
    int lowerBound, upperBound;


    for(i=0; i < numberOfSets; i++){
        scanf("%d %d", &lowerBound, &upperBound);

        //allocating memory and initializing to Zero

        int (*sieve) = malloc(sizeof(int)  * (upperBound+1));
        memset(sieve, 0, (sizeof(int)  * (upperBound+1)));

        //iterating through sieve for even numbers and marking them as non prime
        int counter = 2;
        if(sieve[counter] == 0)
            sieve[counter] = 1;
        int multiplier = 2;
        int multiple = counter * multiplier;

        while(multiple <= upperBound){
            sieve[multiple] = -1;
            multiplier++;
            multiple = multiplier * counter;

        }


        //iterating through sieve (incrementing by two) and filling in primes up to upper limit
        counter = 3;
        while( counter <= upperBound){

            if(sieve[counter] == 0)
                sieve[counter] = 1;
                multiplier = 2;
                multiple = counter * multiplier;

            while(multiple < upperBound){
                sieve[multiple] = -1;
                multiplier++;
                multiple = multiplier * counter;
            }

            counter = counter + 2;

        }

        int newCount = lowerBound;

        //check and print which numbers in the range are prime

        while (newCount <= upperBound){

            if(sieve[newCount] == 1)
                printf("%d\n", newCount);
            newCount=newCount+1;
        }


        //free the allocated memort
        free(sieve);

    }
}
4

1 回答 1

0

问题是我没有检查 Malloc 的结果。我试图分配一个很大的数组并且分配失败。这留下了我分配给 null 的数组,因此我的访问超出了它的范围。

于 2014-02-05T02:35:22.370 回答