我試圖通過維基百科頁面實現Eratosthenes的篩子,由於某些原因,此代碼停止並未完成。我是C的初學者,所以請解釋一下我是否濫用了任何東西。Eratosthenes的篩子停止
我不確定,但是我濫用sizeof(primes)/sizeof(int)
?
#include <stdio.h>
#include <malloc.h>
#define bool char
#define false 0
#define true 1
void sieveOfEratosthenes(const int until, int* primes);
int main(int argc, char** argv) {
puts("sieveOfEratosthenes: 120");
int* primes = malloc(sizeof(int));
sieveOfEratosthenes(120, primes);
for (int i = 0; i < sizeof(primes)/sizeof(int); i++) {
printf("%d:%d\n", i, primes[i]);
}
}
void sieveOfEratosthenes(const int until, int* primes) {
int numbers[until];
for (int p = 2; p < until; p++) {
numbers[p] = true;
}
int p = 2;
while (true) {
for (p = p * p; p < until; p += p) {
numbers[p] = false;
}
for (int count = p; count < until; count++) {
if (numbers[count] == true) {
p = count;
break;
}
}
if (p == until) {
break;
}
}
int j = 0;
for (int i = 0; i < until; i++) {
if (numbers[i] == true) {
primes = realloc(primes, (j + 1) * sizeof(int));
primes[j++] = i;
}
}
return;
}
@undur_gongor我首先只分配一個int,然後在函數中使用'realloc(primes,(j + 1)* sizeof(int))'分配剩下的部分。 – shredder8910
我明白了。這不起作用。 'sizeof'不會「知道」你找到的素數,它只會返回一個指針的大小(例如4或8)。但這並不能解釋觀察到的行爲。 –
通過值傳遞指向素數[]數組的指針。如果'thesieveOfEratosthenes()'函數使用realloc(),main仍然只有一個指向原始數組的指針。 – joop