如果 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/