C - 在一维数组中动态存储素数



我正在制作一个程序,该程序将给定范围内的素数动态存储到一维数组中。我已经阅读了有关 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("%dn",p[1]);//garbage value is printed instead of any prime no.
}

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));
}

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

最新更新