埃拉托斯特尼筛法未输出所期望的结果

3
我正在尝试创建一个程序,给定一个输入值 n,输出质数列表。我编写了SieveEratosthenes函数: - 生成了前n个整数中的质数列表 - 为生成的质数列表创建存储空间 - 返回所生成的质数数量。
以下是主要函数的代码:
int main(){
    int n, i;
    int *primes;

    printf("Number that needs to be prime factorized: ");
    scanf("%d", &n);

    int num_primes;

    num_primes = SieveEratosthenes(n, &primes);
    printf("Generated a list of %d primes\n", num_primes);
    printf("\n");

    for (i = 0; i <= sizeof(num_primes) + 1; i++){
        printf("%d", *primes++);
    }
   printf("\n");

   return 0;
}

假设 n = 20;

我的输出是:

'生成了一个包含8个质数的列表'

2 3 5 7 11 13'

但我想要的输出应该是 '2 3 5 7 11 13 17 19'

我的筛子函数已经正确运行,但我无法在主函数中打印出完整的质数列表。

如果有任何帮助将不胜感激。谢谢!


我建议使用primes[i]而不是*primes++。这样您可以保留对原始数组的指针。 - Benesh
1个回答

4
您不能通过计算sizeof(num_primes)来确定素数的数量:这是一个编译时常量,它不随您输入的num_primes值而改变。看起来您的系统使用四个字节表示int,所以从零到sizeof+1(包括),覆盖了索引0、1、2、3、4和5,这与您观察到打印出六个数字是一致的。
如果SieveEratosthenes返回它找到的质数数量,则循环应从零到该数量遍历,而不是sizeof(num_primes)
for (i = 0; i != num_primes ; i++){
    printf("%d", primes[i]);
}

注意,我将*primes++更改为primes[i]。这是为了帮助您在完成后释放primes并避免内存泄漏。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接