0

tablero[2][2] という私の配列は空です。[0][2] または [1][2] の位置に番号を割り当てようとすると、[1][0] および [2][0] の位置も割り当てられます。なぜこれが起こるのかわかりません

  void introducir_ficha(){
        int valido = 0;
        int pos_x, pos_y;
        while(valido == 0){
            printf("Introduce la posicion que quieres para la ficha \n");
            scanf("%d",&pos_x);
            printf("\n");
            scanf("%d",&pos_y);
            if(pos_x > 2 || pos_y > 2){
                printf("La posicion no es valida... \n");
            }else{
                valido = comprobar_hueco(pos_x, pos_y);
//comprobar_hueco just returns if this position is empty or not
                if(valido == 0){
                    printf("La posicion no es valida... \n");
                }
            }
        }
        printf("Posiciones %d %d \n",pos_x,pos_y);
        tablero[pos_x][pos_y] = 1;
    }

あなたが私を助けてくれることを願っています。

4

2 に答える 2

9

tablero[2][2]は 2 行 2 列の配列です。したがって、4 つの要素は [0][0]、[0][1]、[1][0]、および [1][1] です。[0][2] または [1][2] 要素はありません。

2 のインデックスを使用しようとすると、行または列の境界を超えて、次の行または列にラップするか、配列の外側のメモリに完全にアクセスして、プログラムがクラッシュする可能性があります。

0 から 2 までの要素インデックスを使用するには、3 行 3 列の配列が必要です。

于 2013-11-12T11:29:54.487 に答える
1

問題は、配列の許容インデックスが [0, 1] の範囲内にあることです。配列は行ごとにメモリに配置されます。したがって、配列はメモリ内に次のように表現されます

tablero[0][0] tablero[0][1]
tablero[1][0] tablero[1][1]

インデックス [0][2] を使用して配列の要素にアクセスしようとすると、コンパイラはアドレスを 0 * sizeof( int[2] ) + 2 * sizeof( int ) として計算します (配列の要素の型が整数)。その結果、インデックス [1][0] に対応する要素のアドレスが計算されます。

于 2013-11-12T11:38:32.093 に答える