Помимо проблем с управлением памятью, в коде OP есть и другие проблемы (даже в том, что опубликован как ответ):
int next_prime(int last)
{
printf("%i ", last);
bool isPrime = false;
do {
last++;
for (int i = 0; i < array_lenght; i++) {
if (last % PRIME_ARRAY[i] != 0) isPrime = true; break;
// ^^^^^^^^^^^^^^^^^^^^^^^^
}
} while (!isPrime);
return last;
}
Из-за отсутствия скобок, необходимых для определения области действияВ предложении if
вложенный цикл for на самом деле не является циклом, и вся функция действует так, как если бы она была записана как:
int next_prime(int last)
{
printf("%d ", last);
do {
last++;
} while (last % PRIME_ARRAY[0] == 0);
return last;
}
На самом деле они оба генерируют неправильный вывод:все шансы, а не только простые числа.Например, первые 20 найденных чисел:
2 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
Другая проблема заключается в том, что диапазон этого цикла должен быть ограничен уже известными простыми числами, а не всем массивом, который неинициализирован.
Легким исправлением без добавления какой-либо другой глобальной переменной (их уже слишком много) может быть следующий фрагмент:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int next_prime(int last);
int *PRIME_ARRAY, array_length;
int main(void)
{
printf("How many prime numbers do you want to print? ");
if (scanf("%d", &array_length) != 1 || array_length < 1)
return EXIT_FAILURE;
// Allocate and initialize to zero the array of primes
PRIME_ARRAY = calloc(array_length + 1, sizeof *PRIME_ARRAY);
if (!PRIME_ARRAY)
return EXIT_FAILURE;
int last = 0;
for (int i = 0; i < array_length; i++)
{
// First find the next prime, then print it. Move all the
// update logic to the called function
last = next_prime(last);
printf("%d ", last);
}
putchar('\n');
free(PRIME_ARRAY);
return EXIT_SUCCESS;
}
int next_prime(int last)
{
bool has_factors;
int i;
do {
++last;
has_factors = false;
// Check only the known primes
for (i = 0; PRIME_ARRAY[i] != 0; i++)
{
if (last % PRIME_ARRAY[i] == 0)
{
has_factors = true;
break;
}
}
} while ( has_factors || last <= 1 );
// Update here the array of primes, if there's space left
if ( i < array_length )
PRIME_ARRAY[i] = last;
return last;
}