2011-12-19 9 views
2

奇妙なセグメンテーションフォールトエラーがあります。次のコードは、2D配列のセグメンテーションフォールトエラー

#include <stdlib.h> 
#include <stdio.h> 
main() 
    { 
    int matrixSize = 1000; 
    int i,j; 

    double a[matrixSize][matrixSize]; 
    for (i = 0; i < matrixSize; i++) 
     for (j = 0; j < matrixSize; j++) 
      a[i][j] = rand() % 10; 

     double b[matrixSize][matrixSize]; 
    for (i = 0; i < matrixSize; i++) 
     for (j = 0; j < matrixSize; j++) 
      b[i][j] = rand() % 10; 
    return 0; 
} 

細かい動作します。しかし私は1つの以上の2D配列を初期化しようとしたとき、私は「セグメンテーション違反」の例外を取得:

#include <stdlib.h> 
#include <stdio.h> 
main() 
{ 
    int matrixSize = 1000; 
    int i,j; 

    double a[matrixSize][matrixSize]; 
    for (i = 0; i < matrixSize; i++) 
     for (j = 0; j < matrixSize; j++) 
      a[i][j] = rand() % 10; 

    double b[matrixSize][matrixSize]; 
    for (i = 0; i < matrixSize; i++) 
     for (j = 0; j < matrixSize; j++) 
      b[i][j] = rand() % 10; 

    return 0; 
} 

潜在的な原因は何ですか?

+6

2つのコード例は同じです。 – kennytm

+0

これはなぜC++とマークされていますか? – shuttle87

+0

C++タグを削除しました。 – tpg2114

答えて

10

ほとんどの場合、スタックサイズを超えています。あなたはこれを実行するために使用する端末で

ulimit -s unlimited

と再実行を入力してみてください、あなたはbashの(またはSH)を使用して、Linuxシステム上にあると仮定。

アレイのサイズを変更する必要がある場合、スタックサイズを変更することに何らかの理由で問題がある場合、スタックではなくヒープになるように動的に変更することができます。

0

tpg2114は大きな行列としての割り当ては良い考えではないと言っています。最も簡単には、あなたが以前のように問題なく初期化のために、あなたのネストされたforループを使用し続けることができる

double (*a)[matrixSize] = malloc(sizeof(double[matrixSize][matrixSize])); 
. 
free(a); 

のようにそれを割り当てることです。

NB:あなたはあなたの行列は、技術的に可変長配列 ある次元の変数を使用しているため

  • 、それがmainのためのあなたの定義は、標準に準拠していない
  • C99
  • でのみ利用可能です。 の場合は、 int main(void) { ... }を使用してください。準拠しているコンパイラはこれをキャプチャする必要があるため、コンパイラに正しいオプションを使用しないか、彼が与える警告を無視するように見えます。
  • 彼らは大きさを表していることから、あなたの変数matrixSizeijはタイプsize_tなくintのものでなければなりません。