我有一个名为int *PRIME_ARRAY
. 然后在我的main
函数中,我询问用户这个数组的长度,将其保存int quantita
并设置为PRIME_ARRAY = malloc(sizeof(int) * quantita)
.
当我编译没有错误,但是当我执行它并插入一个数字时,例如“7”,它会产生一个核心转储错误。我尝试以“新手方式”printf()
在所有代码中放置短语来调试它。这样看来问题出在使用malloc()
函数上。
(我必须将数组作为全局变量。next_prime()
必须int last
作为参数)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int next_prime(int last);
int *PRIME_ARRAY;
int main(void)
{
int quantita;
printf("Quanti numeri primi vuoi stampare ? ");
scanf("%i", &quantita);
PRIME_ARRAY = malloc(sizeof(int) * quantita);
int last = 2;
for (int i = 0; i < quantita; i++){
PRIME_ARRAY[i] = last;
last = next_prime(last);
}
free(PRIME_ARRAY);
return 0;
}
int next_prime(int last)
{
printf("%i ", last);
bool isPrime = false;
do {
last++;
for (int i = 0; i < sizeof(PRIME_ARRAY)/sizeof(int); i++){
if (last % PRIME_ARRAY[i] != 0) isPrime = true; break;
}
} while (!isPrime);
return last;
}
除了内存管理问题之外,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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句