さて、私が作成したこの関数は、エラトステネスのふるいアルゴリズムを使用して、すべての素数 <= 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
ご覧のとおり、関数内で何か問題が発生していますが、何が問題なのかわかりません。
意図した出力: 19以下の素数は8個 2 3 5 7 11 13 17 19 私の出力: 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)
NULLではなく0を使用する必要があります。ポインターの配列がありません。
ただし、発見されたぶら下がっているポインター/メモリの問題を修正する方法がよくわかりません。それに加えて、出力の数字に0が追加されている理由がよくわからないため、コード内にエラーのあるものが他にあるかどうか疑問に思っていました...別の出力スタイルについて心配する必要はありません。余分な数字だけです. これで私を助けてくれてありがとう!