エラトステネスのふるい

プロジェクトオイラーの質問を解決しながら、エラトステネスのふるいを読んだ。私は、皆さんがどの質問について私が話しているのか知っていると確信しています だからここに事がある。私のコードは、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
3
これは、おそらく範囲外の配列アクセスのように見えます: prime [j * prime [i]] = 0
追加された 著者 Jon,
int n = 1000000;int n = 2000000; に変更しましたか?
追加された 著者 Dave,
彼が大きな配列のインデックスを作成する場合は、 size_t
追加された 著者 Dave,
副次的なことに、おそらく int 以外のデータ型を使用しているはずです。 Intは、16ビット以外の特定のサイズであることが保証されていません。スタイルの問題として、私は32kを超える数字に対して long を推奨します。
追加された 著者 logancautrell,

1 答え

巨大な配列をスタックに割り当てています:

int prime[2000000]={};

4バイト×200万は8メガバイトに相当します。これはしばしば最大スタックサイズです。それ以上のものを割り当てると、セグメンテーション違反が発生します。

代わりに、配列をヒープに割り当てる必要があります。

int *prime;
prime = malloc(2000000 * sizeof(int));
if(!prime) {
    /* not enough memory */
}
/* ... use prime ... */
free(prime);
9
追加された
4 * 2 * 10 ^ 6 = 7.6 * 2 ^ 20 = 7.6MB
追加された 著者 Dave,
ありがとう!...それは今働く
追加された 著者 Ole Gooner,