c - 为什么我的筛子收到 SIGSEGV

标签 c math

好吧,只是为了好玩,我正在研究埃拉托色尼筛。 它最初运行良好,因此我寻求提高其运行时复杂性。现在,我不知道为什么,但我遇到了段错误。 代码如下:

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

int main(void)
{
    int* check = malloc(1000000000 * sizeof(int));
    long long int i;
    for(i = 0;i < 1000000000;i++)
    {
        check[i] = 0;
    }
    int j = 0;
    for(i = 2;i <= 1000000002;i++)
    {
         if(check[i] == 0)
         {
            printf("%lld\n", i);
            for(j = 1;j < (1000000001/i);j++)
            {
                check[j*i] == 1;
            }
         }
    }
return 0;   
}

任何有关失败原因的帮助将不胜感激。

最佳答案

您的代码有多个错误,其中任何一个都可以解释段错误。首先,您没有检查 malloc 的返回值,它可能是 NULL,即使您完全确定它不可能是这样。

其次,当您将 i 从 2 迭代到 1000000002 时,您超出了分配的数组的边界。有这么多零,很难观察,所以这里是带有分隔符的数字:

Initial allocation: 1,000,000,000
Range of i: 2 to 1,000,000,002 inclusive

在循环结束时,您将访问超出数组末尾的内存。

关于c - 为什么我的筛子收到 SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26327985/

相关文章:

c++ - 数组初始化之间的区别

c - 守护进程不会注册 sigint 信号

c++ - 了解源代码中头文件连接的库

c++ - Sigmoid 曲线不适用于公式 C++

c - 我似乎无法让我的 C 程序接受输入(直角棱柱计算器)

math - float 学有问题吗?

结合 C 和汇编代码

C、为什么我的 'px' 变量为零?

math - 基于某些加权标准计算 'similar'对象的方法

java - 为什么在 Weighted QuickUnion 中联合和查找操作期间的数组访问次数据说是 lg(N) 的顺序?