首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一维数组中动态存储素数

在一维数组中动态存储素数
EN

Stack Overflow用户
提问于 2017-07-30 04:29:39
回答 1查看 1.3K关注 0票数 0

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

代码语言:javascript
复制
#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.
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-30 04:33:06

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

相反,您需要realloc

代码语言:javascript
复制
 int *p = NULL;  // initialize to NULL

在循环中:

代码语言:javascript
复制
        p=realloc(p,j*sizeof(int));

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

(第一次,由于pNULL,它的行为类似于malloc)

请注意,在每次迭代时使用realloc是相当低效的。最好不要频繁地调整大小,并记录容量和实际数据长度。例如,像这样:

Init:

代码语言:javascript
复制
  int growth = 100;
  int capacity = 0;
  int *p = NULL;

在循环中:

代码语言:javascript
复制
  if (j>=capacity)
  {
      capacity += growth;
      p = realloc(p,capacity*sizeof(int));
  }

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45393760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档