2016-09-05 5 views
1

2次元配列を作成しようとしていますが、各座標に1または0がランダムに割り当てられています。それは座標[20] [3]に達するまでうまく動作します。その後、それはちょうど "セグメンテーションフォールト11"をスローします。ループ内の配列要素にアクセスしようとすると、セグメント化エラーが発生します。なぜですか?

私は、どうやって、なぜか、まったく無知です。特に私は200 * 200の行列を作ることができますが、座標[200] [3]でも同じ問題が発生します。したがって、エラーが発生した最後のx座標の第3のy座標は常に何らかの形で表示されます。

#include <stdio.h> 
#include <stdlib.h> 

int main() { 

    int x, y, i, j ; 
    x = 20; 
    y = 20; 

    int grid [x][y]; 

    for (i = 0; i <= x; i++) { 
    for (j = 0; j <= y; j++) { 

     grid[i][j] = rand() % 2 ; 

     printf("grid [%d][%d]: %d\n", i, j, grid[i][j]); 

    } 
    } 
    return 0; 
} 
+0

エラーがあります。 (i = 0; i Alexi

+0

@Alexiそれは何ですか? –

答えて

2

Cは配列に0ベースのインデックスを使用します。だから、off-by-one場合

for (i = 0; i <= x; i++) 
    for (j = 0; j <= y; j++) 

用ループ

int grid [x][y] 

として定義した配列のため。 (<=部分に注意してください)。

詳細を説明すると、pの配列の場合、有効インデックスは0からp-1です。

境界を維持するためにループ条件をi < xj < yに変更する必要があります。境界外メモリにアクセスすると、undefined behaviorが発生します。

  • int main()は、ホストされた環境でのC標準に準拠するために、少なくとも、int main(void)であるべき、と述べた

  • ここでVLAとしてgridを作成する必要はありません。ディメンションがすでにわかっている場合は、コンパイル時定数(#define)を使用して配列ディメンションを生成する方がよいでしょう。
2

あなたは、配列の境界過ぎて実行しています。つまり、の定義されていない動作であり、クラッシュとして現れています。

i <= xi < xなどを変更するか、グリッドサイズを大きくします。

関連する問題