【问题标题】:SIGSEGV with an extremely large array in C++ loopSIGSEGV 在 C++ 循环中具有非常大的数组
【发布时间】:2011-12-27 17:35:49
【问题描述】:

以下使用 sieve 打印一些素数的代码会在在线判断上生成 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++;
    }
}

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

【问题讨论】:

  • 你在调试器中运行过这个吗?这将告诉您是哪条线路导致了 seg-fault。
  • int arr[100000000]; 正在堆栈上创建,这是一个巨大的大小,您应该考虑动态分配数组,或者更好地使用 std::vector

标签: c++ loops memory stack-overflow segmentation-fault


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多