2012-01-24 3 views
0

次の操作を実行すると、セグメンテーションフォルトが発生します。次のようにグリッドサイズを定義します。可変アレイサイズのセグメンテーションフォルト

#define DIM 512 

int x = DIM; 
int y = DIM; 

は今、私はこれらの寸法

complex double arr[x][y]; 

でいくつかの2次元配列を割り当てたいこれは生産この呼び出しとして

complex double arr[512][512]; 

セグメンテーションフォールトは、スムーズに実行されます。私はここで紛失していることが明らかであると確信していますが、誰かが正しい方向に歩みを取っていれば、私は確かに最も義務づけられます。

+0

スタック上で実行していますか? – cnicutar

+6

コンパイラに渡したスイッチとともに問題をコンパイルして表示する、完全で最小限の例を投稿できますか? – nmichaels

+0

と確かにあなたは私たちにsegfaultがどこに*表示されるべきですか? segfaultを引き起こす任意の条件を変更するため、ここに表示されるのはあなたの問題が他の場所にある可能性があります。 –

答えて

1

あなたは、静的配列を定義する場合:

complex double arr[512][512]; 

コンパイラはそれがものになるかどうか、大きな知っているので、それが適切にメモリを予約します。しかし、あなたは可変配列を宣言すると、

complex double arr[x][y]; 

あなただけの関数内でこれを行うことができ、コンパイラは、それがどのくらい大きくなるかを知ることができないので、それはそれのための適切なスペースを確保することはできません。スペースはスタックに割り当てられ、スタックにはそのアレイに必要な4MBがないことは明らかです。

例:

double arr1[10240][10240]; 

int main() { 
     double arr2[10240][10240]; 
     int i = 10240; 
     int j = 10240; 
     double arr3[i][j]; 
} 

arr3実行したときに、それをコメントアウトし、セグメンテーションフォルトを引き起こし、それが動作します。 arr1がデータセクションに置かれ、arr2がスタックに置かれますが、スタックはそれを保持するのに十分な大きさになります(コンパイラは既知のサイズであるため、コンパイラはこれを実行できます)。ただし、arr3は固定サイズではないため、コンパイラはスペースを確保できません。プログラムはそれをスタックに割り当てようとしますが、大きすぎるので、割り当てによってsegfaultが発生します。

+0

@nos - 固定、ありがとう。 – Kevin

+0

実際、この例は少なくとも最近のgccの場合は単純すぎます。あなたはsegfaultを引き起こすために配列を使う必要があります。 –

+0

@DanielFischerそれは私の上でセグメンテーションされた、私はそれが4.4だと思う、私は仕事に戻るときに確認することができます。 – Kevin

関連する問題