Не печатается желаемый результат для сита эратостена

Я пытаюсь создать программу, которая выводит список простых чисел с заданным входным значением n.

Функция SieveEratosthenes, которую я сделал: - генерирует список простых чисел по первым n целым числам - создает хранилище для списка сгенерированных простых чисел - возвращает количество сгенерированных простых чисел.

Вот код в моей основной функции:

int main(){
    int n, i;
    int *primes;

    printf("Number that needs to be prime factorized: ");
    scanf("%d", &n);

    int num_primes;

    num_primes = SieveEratosthenes(n, &primes);
    printf("Generated a list of %d primes\n", num_primes);
    printf("\n");

    for (i = 0; i <= sizeof(num_primes) + 1; i++){
        printf("%d", *primes++);
    }
   printf("\n");

   return 0;
}

Скажем, n = 20; Мой вывод:

'Сгенерировал список из 8 простых чисел

2 3 5 7 11 13'

Когда мой желаемый результат должен быть «2 3 5 7 11 13 17 19»

Моя функция сита работает правильно, но я не могу распечатать весь список простых чисел в своей основной функции.

Любая помощь приветствуется. Спасибо!


person user3291818    schedule 10.03.2014    source источник
comment
Я бы предложил primes[i] вместо *primes++. Таким образом вы сохраняете указатель на исходный массив.   -  person Benesh    schedule 11.03.2014


Ответы (1)


Вы не можете определить количество простых чисел, вычислив sizeof(num_primes): это константа времени компиляции, она не меняется со значением, которое вы помещаете в num_primes. Похоже, что ваша система использует четыре байта для int, поэтому итерация от нуля до sizeof+1 включительно охватывает индексы 0, 1, 2, 3, 4 и 5, что согласуется с вашим наблюдением, что печатаются шесть чисел.

Если SieveEratosthenes возвращает количество найденных простых чисел, ваш цикл должен повторяться от нуля до этого числа, а не до sizeof(num_primes):

for (i = 0; i != num_primes ; i++){
    printf("%d", primes[i]);
}

Обратите внимание, что я изменил *primes++ на primes[i]. Это поможет вам освободить primes, когда вы закончите, и избежать утечки памяти.

person Sergey Kalinichenko    schedule 10.03.2014