2D配列によるセグメンテーションフォールトエラー

奇妙なセグメンテーションフォールトエラーがあります。次のコードは正常に動作します

#include  
#include 
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配列を初期化しようとすると、 "segmentation fault"例外が発生します。

#include 
#include 
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;
}

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

2
私はC ++タグを削除しました。
追加された 著者 tpg2114,
2つのコード例は同じです。
追加された 著者 kennytm,
なぜこれはc ++とマークされていますか?
追加された 著者 shuttle87,

2 答え

スタックサイズを超過しています。

あなたがこれを実行するために使用している端末で、

ulimit -s無制限

あなたがbash(またはsh)を使っているLinuxシステムであると仮定して、再実行します。

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

10
追加された

tpg2114は大きな行列としての割り振りは良い考えではないと言っています。そのようなものを割り当てるのが最も簡単です

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

そうすれば、ネストされた for ループをそのまま初期化に使用することができます。

注意:

  • 行列の次元に変数を使用するため 技術的にはC99でのみ利用可能な可変長配列
  • main の定義が標準に準拠していません。あなたの int main(void){...} を使用する必要があります。準拠しているコンパイラはこれをキャプチャする必要があるため、コンパイラに正しいオプションを使用しないか、彼が与えた警告を無視するように見えます。
  • サイズを表すので、変数 matrixSize i j int ではなく size_t
0
追加された