gpt4 book ai didi

c - 我的代码中的段错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:40:10 25 4
gpt4 key购买 nike

这是我在 sphere online judge 提交的用于生成素数的代码,但我遇到了段错误。目标是generate prime numbers在给定范围 m 到 n 之间(n > m)。这是使用埃拉托色尼筛法算法实现的。请告诉我哪里出错了。谢谢 :)

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

int main(){
long int m,n,c1,c2,c3;
int t;

scanf("%d",&t);
while(t--)
{
scanf("%d %d",&m,&n);


//create prime list
short int *prime;
prime = (short int*)malloc((n-m)*sizeof(short int));

//fill list with 0 - prime
for(c1 = 2; c1 <= n; c1++){
prime[c1] = 1;
}

//set 1 and 0 as not prime
prime[0]=0;
prime[1]=0;

//find primes then eliminate their multiples (0 = prime, 1 = composite)
for(c2 = 2;c2 <= (int)sqrt(n)+1;c2++){
if(prime[c2]){
c1=c2;
for(c3 = 2*c1;c3 <= n; c3 = c3+c1){
prime[c3] = 0;
}
}
}

//print primes
for(c1 = m; c1 <=n; c1++){
if(prime[c1]) printf("%d\n",c1);
}
}
return 0;
}

最佳答案

c3最高可达 n在最内层的循环中,但你只能分配少于 n阵列中的插槽。其实就算你分配了n插槽,索引 n将比您分配的插槽数多一个。在最坏的情况下,您只会破坏数组末尾的一些内存,但希望不会破坏堆栈。充其量,我猜你会遇到段错误。你可能想改变你的 X <= nX < n或在数组中再分配一个元素。事实上,你可能应该只分配 (n + 1) * sizeof(short)数组的字节数。

此外,您永远不会设置 t,也永远不会验证用户输入。如果这是一场对输入有限制的比赛,后者可能没问题。此外,您永远不会释放 prime数组,所以你有内存泄漏。

关于c - 我的代码中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4841551/

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