c++ - 段错误(核心转储)只有更大的输入

标签 c++ segmentation-fault core

如果 seive(n) 为 1000000,我的代码将完美运行。如果 seive(n) 大于 10000000,它会显示段错误(核心已转储)。我已阅读有关段错误的信息。但我无法解决这个问题。

    #include <stdio.h>
    #include <math.h>

    using namespace std;


    int seive(long int n)
    {
        long int A[n];

        for (long int i = 2; i <= n; i += 1)
        {
            A[i] = i;
        }
        long int root = (int)sqrt(n);

        for(int j = 2; j <= root; j++)
        {

            for(int k = 2*j; k < n ; k = k + j)
            {       
                A[k] = 0;
            }
        }
        int count = 0;
        for (int l = 2; l < n; ++l)
        {
            if(A[l] != 0) count++;
        }
        printf("%d\n", count);

    }

    int main()
    {
        seive( 1000000);
    }

最佳答案

long int A[n];

这是一个栈上的数组。它真的很大,如果 N 很大。在这些情况下,您的堆栈不足以容纳它,您将收到堆栈溢出错误。

解决方案包括:

动态分配内存:long int *A = (long int *)malloc(n*sizeof(long int));

动态分配内存 C++ 风格:long int *A = new long int[n];

使用静态分配的缓冲区(然后不在堆栈上):static long int A[n];

使其全局化:将该行移动 3 行。

关于c++ - 段错误(核心转储)只有更大的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24949517/

相关文章:

c++ - 如何在模板函数中获得两倍于指定类型大小的类型?

c - 第 5 次扫描后出现段错误

c - 获取段错误而不是打印结构值

c++ - bitblt 在 Windows 10 版本 1703 (15063.138) 上失败

c++ - DirectX11 ReportLiveObjects 实例化

linux - 核心文件不是在 ARM 上的段错误上创建的

performance - GHC 产生冗余核心操作

c++ - 为什么taskset对fedora没有影响?

c++ - 使用 insert c++ 增加 map 中的值

c++ - 遍历数组时出现段错误