シーブを使用していくつかの素数を出力する次のコードは、オンラインジャッジでSIGSEGVエラーを生成します。C++ループで非常に大きな配列を持つ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++;
}
}
は、上記のように第二のループを変更します。エラーは表示されません。これがなぜ発生するのか、このintを最初のプログラムで修正する方法についての助けになるかもしれません。
は、デバッガでこれを実行することがありますか?これにより、seg-faultの原因となった行が表示されます。 –
'int arr [100000000];'がスタック上に作成されています。これは、配列を動的に割り当てることを検討すべき巨大なサイズです。単に 'std :: vector'を使うだけです。 –