使用 malloc() 函数设置全局数组大小获取转储核心

臭豪猪

我有一个名为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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章