0

重複の可能性:
c++ のスタック オーバーフロー

素数を生成するための次のプログラムがあります。

#include<iostream> 
#include<cmath>
#include<algorithm>

#define MAX 10000000
using namespace std;

int main(int argc, const char *argv[])
{
    bool prime[MAX+1];
    fill_n(prime,MAX+1,true);
    int baseSqrt,i,j;
    baseSqrt = int(sqrt(MAX+1));
    for(i=2;i<=baseSqrt;i++){
        if(prime[i]){
            for(j=i+i;j<=MAX;j+=i){
                    prime[j]=false;
            }   
        }   
    }   
    return 0;
}

プログラムは MAX 値 = 1000000 で正常に動作します。しかし、値を 10000000 に増やすと、プログラムは segfault を返します。gdb を使用してみましたが、メインで segfault が発生して停止します。64 ビット OS を使用しています。MAX を削除して、MAX ではなく 10000000 を書き込んでも、同じエラーが発生します。どこが間違っていますか?助けてください。

4

2 に答える 2

5

通常、スタック サイズは非常に限られているため、非常に大きな配列をローカル変数として (つまり、スタック上で) 宣言しないでください。代わりに、new[]およびで動的に割り当てますdelete[]。または慣用的な C++ の場合は、 のようなコンテナー クラスを使用しますstd::deque

于 2013-01-06T12:41:01.833 に答える
0

この特定のケースでは、「プライム」をグローバル変数にするのは合理的な考えではないでしょうか。グローバル変数が常に良い解決策であるとは限らないことは理解していますが、この特定のケースでは、それはかなり明白な解決策です。MAX が定数ではないというわけではないので、ソリューションとして new/delete または vector を使用するのは少し不必要に思えます。

そして、「「新しい」変数とグローバル変数の使用が遅い場合」という質問に答えるには、おそらく無関係であると言えます。#define MAX 1000000000上記のコードで使用し、プライムをグローバルに移動し、時間を使用して実行しました。 new/delete を使用するようにコードを変更し、約 0.5 秒長くかかりましたが、全体の実行時間は 20.4 または 20.9 秒であるため、合計実行時間の約 2% であり、2% 以上を獲得できると確信しています。他のことをすることによって。

于 2013-01-06T14:01:35.697 に答える