gpt4 book ai didi

c - 素数高达 N(N>10000) 的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:57:53 24 4
gpt4 key购买 nike

我在寻找最多 N 个素数的程序中遇到段错误。

我使用素数的动态链表来测试 N 的效率。

问题是它在 N<=17508 时有效。它失败了更大的 N。特别是当我把打印输出加起来时,它总是有段错误。谁能帮忙?谢谢。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct prime{
long value;
struct prime *next;
}prime;

long numofprime(long n)
{
long a, b, c;

prime *head, *p1, *p2, *p3;
int flag;

if(n<0)
n=-n;

if(n<2)
return 0;
else if(n==2)
return 1;
else
{/*creat linked list*/
p1=(prime *)malloc(sizeof(prime));
p1->value=2;
p1->next=NULL;
p2=p1;
head=p1;

b=1;
for(a=3;a<=n;a+=2)
{
flag=0;
p3=head;
while(p3!=NULL)
{
c=p3->value;
if(a%c==0)
{
flag=1;
break;
}
p3=p3->next;
}

if(flag==0)
{/*add prime number to the linked list*/
p1=(prime *)malloc(sizeof(prime));
p1->value=a;
p2->next=p1;
p2=p1;
b++;
}
}

c=0;
while(head!=NULL)
{
printf("%5ld ", head->value);
if(c%15==0) printf("\n");
head=head->next;
c++;
}

return b;
}

}

int main(int argc, char *argv[])
{

long n;
long np;

if(argc<2)
{
printf("Please input the max num!\n");
exit(0);
}
else if(argc>2)
{
printf("Too many arguments!\n");
exit(0);
}
else
n=strtol(argv[1], NULL, 10);

np=numofprime(n);

printf("\n\nthere are %ld primes < n!\n", np);

return 0;
}

最佳答案

当您为链表分配新项时,请始终将指向下一个 项的指针设置为NULL。否则,无法检测到链表的末尾,出现未定义的行为并且可能出现段错误。

例如:

        {/*add prime number to the linked list*/
p1=malloc(sizeof(prime));
if(p1==NULL){fprintf(stderr,"failed to allocate\n");exit(1);}
p1->value=a;
p1->next=NULL; ///this new line here
p2->next=p1;
p2=p1;
b++;
}

此外,不要忘记在函数末尾free() 内存。执行 head=head->next 打印链表不会简化此操作,因为返回是不可能的:指向链表开头的指针丢失。始终在某处保留指向链表开头的指针!

关于c - 素数高达 N(N>10000) 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31365514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com