在1d数组中动态存储素数

时间:2017-07-29 20:29:39

标签: c arrays memory dynamic allocation

我正在制作一个程序,将给定范围内的素数动态存储到1-d数组中。我已经读过c中的动态内存分配,但我不知道我的代码有什么问题。 最初我定义了一个" isprime"检查数字是否为素数的函数,如果数字是素数,则返回1。 之后我使用for循环,它有助于在数组中存储素数。 在for循环中,我使用if语句检查用户输入的范围中的数字是否为素数,如果是素数,则将其存储在数组p中,使用malloc动态分配内存。 但是在数组p中没有存储素数而是存储了垃圾值,我不知道为什么素数不会存储在我的数组中?

#include<stdio.h>
#include<math.h>
int isprime(int n)
{
    int i;
    for(i=2;i<sqrt(n);i++)
    {
        if(n%i==0)
        {
            return 0;
        }
    }
    return 1;
}
main()
{
    int *p,i,n,j=1;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        if(isprime(i)&&i!=0&&i!=1)
        {
            p=malloc(j*sizeof(int));//Memory allocation for p should increase as more prime no.s are stored
            p[j-1]=i;
            j++;

        }
    }
    printf("%d\n",p[1]);//garbage value is printed instead of any prime no.
}

1 个答案:

答案 0 :(得分:2)

malloc每次都会在循环中返回一个新的内存区域,从而丢失以前的数据。

您需要realloc

 int *p = NULL;  // initialize to NULL

并在循环中:

        p=realloc(p,j*sizeof(int));

因此保留p地址并增加内存,复制p之前的数据并发出新的p。无论哪种方式,它都对你透明。

(第一次,pNULL,其行为类似于malloc

请注意,在每次迭代时realloc效率相当低。最好不要经常调整大小,并记录容量和实际数据长度。例如:

初​​始化:

  int growth = 100;
  int capacity = 0;
  int *p = NULL;

并在循环中:

  if (j>=capacity)
  {
      capacity += growth;
      p = realloc(p,capacity*sizeof(int));
  }

除此之外:正如评论所指出的,对于完整工作的答案,在检查素数时不要省略最后一个值,否则你会发现完美的正方形为素数。