以下使用筛子打印一些素数的代码会在线判断时产生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);
}


但是如果我删除一些声明为:

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


如上修改第二个循环。它没有显示错误。对于为什么会发生这种情况以及如何在第一个程序中更正此问题可能会有所帮助。

最佳答案

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

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

std::vector<int> arr(100000000);

关于c++ - SIGSEGV在C++循环中具有极大的数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8647518/

10-13 07:44