为什么我的代码执行我没写的作业?

时间:2013-11-12 11:24:45

标签: c arrays

我的数组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;
    }

我希望你能帮助我。

2 个答案:

答案 0 :(得分:9)

tablero[2][2]是一个2乘2的数组。因此,四个元素是[0] [0],[0] [1],[1] [0]和[1] [1]。没有[0] [2]或[1] [2]元素。

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

要使用0到2之间的元素索引,您需要一个3乘3的数组。

答案 1 :(得分:1)

问题是数组的可接受索引在[0,1]范围内。数组逐行放在内存中。所以你的数组将在内存中表示为

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

当您尝试使用索引[0] [2]访问数组的元素时,编译器会将地址计算为0 * sizeof(int [2])+ 2 * sizeof(int)(假设元素类型为arrray是int)。结果,它将计算与索引[1] [0]

对应的元素的地址