SIGSEGV在C++循环中有一个非常大的数组

use*_*550 0 c++ memory stack-overflow loops segmentation-fault

以下使用筛子打印一些质数的代码会在在线判断中生成SIGSEGV错误.

int main()
{
long count=1;
int arr[100000000];
printf("2\n");
for(long i=3;i<100000000;i=i+2)
{
    arr[i]=1;
}
for(long i=3;i<100000000;i=i+2)
{
    if(arr[i]==1)
    {
        count++;
        if(count%100==1)printf("%ld\n",i);
        for(long j=2;i*j<100000000;j++)
            arr[i*j]=0;
    }
}
//scanf("%ld",&count);
}
Run Code Online (Sandbox Code Playgroud)

但如果我删除一些陈述:

for(long i=3;i<100000000;i=i+2)
{
    if(arr[i]==1)
    {
        count++;
    }
}
Run Code Online (Sandbox Code Playgroud)

如上修改第二个循环.它没有显示错误.可以帮助解决为什么会发生这种情况以及如何在第一个程序中纠正这个问题.

Mik*_*our 6

这几乎肯定是堆栈溢出,由声明一个巨大的自动数组引起.自动变量通常放在堆栈上,堆栈的最大大小通常为几兆字节.

您可以使用动态数组来修复它,通常在堆上分配:

std::vector<int> arr(100000000);
Run Code Online (Sandbox Code Playgroud)