scanf()更改矩阵索引的值

时间:2018-06-21 12:47:05

标签: c arrays

#include <stdio.h>

int main() {
int i, j, vet [1][1];

for (i=0; i<2; i++){
    for (j=0; j<2; j++){
        scanf ("%d", &vet[i][j]); //input values for each position
        printf("\nvet[%d][%d] = %d", i, j, vet[i][j]); //print the entire matrix
    }
    printf("\n");
}
return 0;
}
  

输入:

     

1 2 3 4 5 6 7 8 9

     

输出:

     

1 2 3

     

4 5 6

     

7 8 0

该代码将9的值分配给'j'而不是vet [i] [j],后者与vet [2] [2]相对应。因此,我在最后打印的项目中得到了[2] [9] = 0。 为什么会这样?

1 个答案:

答案 0 :(得分:3)

对于像这样定义的数组

 int vet [1][1];

唯一有效的索引是0,即vet[0][0]。使用索引值1会进行超出范围的访问。因此,在内部循环的第二次迭代中,对于外部循环的第一次迭代,您试图访问超出范围的内存,这会调用未定义的行为。然后,行为是-很好,未定义。您无法证明输出是否正确。

如果您想要一个包含2个成员的数组的数组,则必须将定义更改为

int vet [2][2];

注:建议更改数组维数,否则,如果只有一个元素,则循环本身没有意义。您可以通过使循环终止条件i < 1j < 1来确保代码有效,但是在这种情况下,循环将变得毫无意义。