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 x 2 数组。因此,四个元素是 [0][0]、[0][1]、[1][0] 和 [1][1]。没有 [0][2] 或 [1][2] 元素。

如果您尝试使用 2 的索引,它将超出行或列的边界,并可能换行到下一行/列,或者它将完全访问数组外的内存并可能使程序崩溃。

要使用从 0 到 2 的元素索引,您需要一个 3 x 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 回答