2017-10-31 27 views
-6

を与えるなぜこのコードは、コードブロックにうまく動作しますが、codechefのコンパイラ にランタイム(SIGSEGV)エラーになります以下のコードを通過し、このerror.Thankに対する解決策を教えてください君は。C++セグメンテーションエラー:このプログラムは、ランタイムエラー(SIGSEGV)

#include<iostream> 
using namespace std; 
int main(){ 
int t; 
long n; 
cin>>t; 
while(t--){ 
    cin>>n; 
    int i=2,m=0,j=0,a[n/2]; 
    while(i<=n/2){ 
     if(n%i==0){ 
      n=n/i; 
      a [ j++ ] = i; 
      m++; 
      i = 2; 

     } 
     else i++; 
     a[j] = n; 
    } 
    cout << m+1 << endl; 
    for(int i=0;i<=m;i++) 
     cout << a[i] << endl; 
} 
return 0; 
} 
+3

デバッグを行いましたか?あなたはSegfaultが何によって引き起こされたのか調べましたか? – Carcigenicate

+0

どこが失敗しているのですか、これを修正するためのあなたの努力は何ですか? –

+0

このコードではセグメンテーションフォルトは表示されません。しかし、私はいくつかのコンパイラでは配列を宣言するために一定の値を与える必要があることに言及する価値があると思います。そうしないと、コンパイラエラーが発生します。 – Hamed

答えて

0

これは、無効なメモリ参照またはセグメント化エラーが原因のエラーです。最も一般的な原因は、範囲外の配列要素にアクセスしているか、あまりにも多くのメモリを使用していることです。

あなたがしようとするためのいくつかの点:

は、あなたが初期化されていない変数を使用していないことを確認してください。これらはあなたのコンピュータでは0に設定されているかもしれませんが、裁判官にいることは保証されていません。

配列要素にアクセスするすべての発生をチェックし、範囲外である可能性があるかどうかを確認します。

あまりにも多くのメモリを宣言していないことを確認してください。 64 MBが保証されていますが、サイズが[10000] [10000]の配列は動作しません。

スタックメモリをあまりにも多く宣言していないことを確認してください。どの大規模配列も、関数の外部ではグローバルに宣言する必要があります。おそらく関数内に100000個のint配列を置くことはできません。

この問題を解決するには、静的メモリ割り当てを使用してください。

セグメンテーションフォールトの他の原因のいくつかは、次のとおりです。初期化されていないポインタにプログラムがないメモリにアクセスするNULLポインタ

  • 間接参照を使用して

    1. 自分の。

    セグメンテーションフォルトの詳細については、こちらをご覧ください。 click here

    whileループコードも確認してください。

  • +0

    ありがとうございましたが、私はこの種の理論をWeb上で以前にも見つけました。なぜこのプログラムのコードがこの種のエラーを出すのか教えてください。また、どのように修正することができます。 –