#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个
四五六
7.80万
代码将9的值赋给“j”,而不是对应于vet[2][2]的vet[i][j]。因此,在最后一个打印项目中,我得到vet[2][9]=0。
为什么会这样?

最佳答案

对于定义为

 int vet [1][1];

唯一有效的索引是0,即vet[0][0]。使用索引值1进行越界访问。因此,在内部循环的第二次迭代中,对于外部循环的第一次迭代,您将尝试访问超出限制的内存,这将调用未定义的行为。然后,行为是-嗯,未定义的。如果有输出,则不能对正。
如果希望有一个包含2个成员的数组数组,则必须将定义更改为
int vet [2][2];

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

关于c - scanf()更改矩阵索引的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50968953/

10-11 18:05