gpt4 book ai didi

c - 如何使用动态数组?

转载 作者:行者123 更新时间:2023-11-30 16:39:55 25 4
gpt4 key购买 nike

Q:使用 Sieve of Eratosthene 查找两个给定数字 a 和 b 之间的所有素数.

我使用动态数组来存储素数,但它不起作用。

调试后一切正常,直到最后 printf() 崩溃了。

代码

int main() {

int i, j, n, a, b, k;
int *tab;
scanf("%i", &n); // n is number of sets

for (i = 1; i <= n; i++){
scanf("%i %i", &a, &b);

tab = (int*) malloc(b * sizeof(int)); //allocating the memorry

for (j= 0; j < b; j++){ //seting all numbers to be prime
*(tab + j) = 1;
}

for (j = 2; j <= b; j++){

if (*(tab + j) == 1){
for(k = j; k <= b; k+=j)
*(tab + k) = 0; //seting 0 for all non prime numbers
}

}

for (j = a; j <= b; j++){
if (*(tab + j) == 1){
printf("%i", j); //printing prime numbers
}
}
free(tab);
}
return 0;
}

最佳答案

你的第二个循环应该是

        for (j = 2; j <= b; j++){

if (*(tab + j) == 1){

for(k = j; k <= b; k += j)
*(tab + k) = 0; //seting 0 for all non prime numbers
}

}

问题在于,因为您使用了乘法,所以您尝试访问选项卡数组中索引高于其分配大小的项目。

编辑:正如@melpomene所说,数组太短了。因此分配应该是

            tab = (int*) malloc((1+b) * sizeof(int));

关于c - 如何使用动态数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46879587/

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