好了,所以该功能我创建使用埃拉托塞尼的筛的算法来计算所有的质数<= N。 该功能存储素数,并在参数素数的计数。
当该功能退出,素数应指向动态分配存储器的块,其保持所有素数<= NUM。 *count
将有质数的计数。
这里是我的功能getPrimes
:
void getPrimes(int num, int* count, int** array){
(*count) = (num - 1);
int sieve[num-1], primenums = 0, index, fillnum, multiple;
//Fills the array with the numbers up to the user's ending number, num.
for(index = 0, fillnum = 2; fillnum <= num; 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(num); primenums++) //Walks through the array.
{
//Checks if that number is NULL which means it's crossed out
if (sieve[primenums] != 0) {
//If it is not crossed out it starts deleting its multiples.
for (multiple = (sieve[primenums]);
multiple < num;
multiple += sieve[primenums]) {
//Crossing multiples out
//and decrements count to move to next number
sieve[multiple + primenums] = 0;
--(*count);
}
}
}
int k;
for(k=0; k < num; k++)
printf("%d \n", sieve[k]);
printf("%d \n", *count);
array = malloc(sizeof(int) * (num + 1));
assert(array);
(*array) = sieve;
}
现在,这里是预期的输出和我的输出。 正如你所看到的东西是我的错之内getPrimes
功能,但我不能确定是什么。
Intended Output: There are 8 prime numbers less than or equal to 19 2 3 5 7 11 13 17 19 My Output: 2 3 0 5 0 7 0 0 0 11 0 13 0 0 0 17 0 19 0 0
以下是人们向我指出,到目前为止3个问题:
- 错误删除过程
if (sieve[multiple]) {
阵列筛索引具有偏压 -
(*array) = sieve;
泄漏刚刚malloc内存,并让*array
点到停止时的函数返回存在一个局部变量-你会得到一个悬摆指针。 -
if(sieve[i] != NULL)
应该使用0,而不是NULL,你不具有指针数组。
不过,我也不太清楚如何解决已经发现了我的悬摆指针/内存问题。 除此之外,我不知道是否有我的代码内的任何其他的我也不太清楚有错误的,为什么我在我的输出添加的0的......不用担心不同的输出样式,只是额外的数字号码。 谢谢如果你能帮助我这个!