在C语言的Eratosthenes代码筛中显示结果时出现问题

问题描述

我正在用C编写“ Eratosthenes筛”的代码,该代码将打印所有素数到n。这是我的代码

#include <stdio.h>  
#include <stdlib.h>
#include "input2.h"

int main() 
{
    int n = read_int();
    int length = n-1;

    int *block_of_memory = (int *)malloc(sizeof(int));


    for(int i = 2; i <= length; i++)
    {
        block_of_memory[i] = 1;
    }

    for(int i = 2; i*i <= length; i++)
    {
        if(block_of_memory[i] == 1)
        {
            for(int j = i*i; j < length; j = j+i)
            {
                block_of_memory[j] = 0;
            }
        }

    }

    for (int i = 1; i <= length; ++i)
    {
        if(block_of_memory[i] == 1)
        {
            printf("%d\n",i);
        }

    }



    print_prime(block_of_memory,length);

    free(block_of_memory);

    return 0;

}

我不确定我在做什么错。当我想要所有主要的住宅区5(例如)时,我得到:

Give a number: 5
1
1
4,5,

解决方法

您没有分配足够的内存:

int *block_of_memory = (int *)malloc(sizeof(int));

实际上应该是:

int *block_of_memory = malloc(n * sizeof(int));

这样,您可以为整个n个int数组分配空间,而不仅仅是一个int。另外,never cast the result of malloc。此外,您的代码还有一些逻辑错误:

for(int j = i*i; j < length; j = j+i)
{
    block_of_memory[j] = 0;
}

实际上应该是:

for(int j = i*i; j <= length; j = j+i)
{
    block_of_memory[j] = 0;
}

(请注意,< length变为<= length)。这样,每个元素都会得到正确检查,包括length - 1处的元素。