c - scanf() 改变矩阵索引的值
问题描述
#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]。因此,我在最后一个打印项目中得到了 vet [2][9] = 0。为什么会发生这种情况?
解决方案
对于像这样定义的数组
int vet [1][1];
唯一有效的索引是0
,即vet[0][0]
。使用索引值 1 会使访问越界。因此,在内循环的第二次迭代中,对于外循环的第一次迭代,您试图访问超出限制的内存,这会调用未定义的行为。然后,行为是 - 好吧,未定义。如果有的话,你不能证明输出是合理的。
如果您想要一个包含 2 个成员的数组,您必须将定义更改为
int vet [2][2];
注意:建议更改数组维度,否则,如果您只有一个元素,则循环本身没有意义。您当然可以通过使循环终止条件i < 1
and使代码有效j < 1
,但在这种情况下,循环将变得毫无意义。
推荐阅读
- javascript - 字母数字键的编辑器按键锁定
- r - 如何在 aws ec2 windows 实例中安排 rselenium - rvest 抓取脚本
- python - Django编写数据库迁移转发功能问题
- neo4j - 需要使用密码查询将多个json合并为neo4j中的单个json
- ubuntu - USB_ModeSwitch 不能使用接口 0 的 MessageContent 中的存储命令
- assembly - x86 没有代码输出,无法调试 MASM32
- html - 如何更改把手标题和属性值的颜色?
- entity-framework - 如何禁用 EF Core 3 中的错误
- python - 当我运行此代码 uniqe[0] 获取单词中的第一个字母时,我希望它在 uniqe[0] 中包含整个单词
- scala - 内部流程已完成,但未生成 1 个优秀元素的结果元素