gpt4 book ai didi

c - C 中埃拉托色尼筛法算法的分割错误

转载 作者:行者123 更新时间:2023-11-30 21:26:29 32 4
gpt4 key购买 nike

好的,所以我创建的这个函数使用埃拉托色尼筛法算法来计算所有 <= n 的素数。该函数在参数中存储素数和素数个数。

当函数退出时,素数应该指向动态分配的内存块,该内存块保存所有 <= num 的素数。 *count 将得到素数的个数。

这是我的函数 getPrimes:

void getPrimes(int usernum, int* count, int** array){
(*count) = (usernum - 1);
int sieve[usernum-1], primenums = 0, index, fillnum, multiple;

//Fills the array with the numbers up to the user's ending number, usernum.
for(index = 0, fillnum = 2; fillnum <= usernum; index++, fillnum++){
sieve[index] = fillnum;
}

/*Starts crossing out non prime numbers starting with 2 because 1 is not a prime. It then deletes all of those multiples and
moves on to the next number that isnt crossed out, which is a prime. */
for (; primenums < sqrt(usernum); primenums++){ //Walks through the array.
if (sieve[primenums] != 0){ //Check's if that number is 0 which means it's crossed out
for (multiple = (sieve[primenums]); multiple < usernum; multiple += sieve[primenums]){ //If it is not crossed out it starts deleting its multiples.
//Crossing multiples out and decrements count to move to next number
sieve[multiple + primenums] = 0;
--(*count);
}
}
}
int k;
for (k = 0; k < usernum; k++)
if (sieve[k] != 0){
printf(" %d", sieve[k]);
}
printf(" ");
array = malloc(sizeof(int) * (usernum + 1));
assert(array);
(*array) = sieve;
}

我的函数在这里编译完美,但是我注意到当我尝试从 101 开始的更大数字时出现段错误。有人看到我的代码在哪里产生段错误吗?

最佳答案

以下两条语句有问题:

array = malloc(sizeof(int) * (usernum + 1));

我认为您的意思是*array = malloc...,请注意我在array之前添加的星号。您想要取消引用 int** 参数,以便修改调用者的指针

(*array) = sieve;

此代码不会复制数组,它将临时局部变量的地址分配给调用者的指针sieve 数组在函数结束时超出范围后将不再存在。您想要使用 for 循环将内容从 sieve 复制到您刚刚分配的内存块。

编辑:

我看到Daniel Fischer 3小时前已经指出了第二个问题in a previous incarnation of your question .

关于c - C 中埃拉托色尼筛法算法的分割错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15713877/

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