質問: エラトステネスのふるい プロジェクトオイラーの質問を解決しながら、エラトステネスのふるいを読んだ。私は、皆さんがどの質問について私が話しているのか知っていると確信しています だからここに事がある。私のコードは、100万以下のすべての素数を正しく表示するように管理しています。 しかし、私は同じ実装を200万回試してみると、私にセグメンテーションフォールトを与えています... 私はなぜエラーが来るのかについての特定のアイデアを持っていますが、それを修正する方法はわかりません... 100万以下の素数のコードは次のとおりです。 ``` #include int main(void) { int i,k=2; int j; int n=1000000; int prime[2000000]={}; for(i=0;in) break; } } } } for(i=0;i ```
回答: 巨大な配列をスタックに割り当てています: ``` int prime[2000000]={}; ``` 4バイト×200万は8メガバイトに相当します。これはしばしば最大スタックサイズです。それ以上のものを割り当てると、セグメンテーション違反が発生します。 代わりに、配列をヒープに割り当てる必要があります。 ``` int *prime; prime = malloc(2000000 * sizeof(int)); if(!prime) { /* not enough memory */ } /* ... use prime ... */ free(prime); ```