C语言使用两个自定义数组填充2×5矩阵时打印输出异常
问题原因
你的矩阵填充逻辑存在下标使用错误,这是导致输出异常的直接原因:
- 你定义的二维数组
m[2][5]访问格式为m[行下标][列下标],合法行下标范围是01,合法列下标范围是04。 - 填充矩阵的嵌套循环里,外层循环变量
i仅遍历0、1两个值(对应2行),内层循环变量j才会遍历0~4全部5个列下标,但你赋值时完全没有使用j作为列下标,反而用仅能取到0、1的i当列下标,相当于内层5次循环一直在重复给m[0][0]、m[1][0]、m[0][1]、m[1][1]这四个位置赋值,列下标为2、3、4的6个元素从未被写入。 - 局部数组
m是栈上分配的未初始化变量,未写入的位置残留值为0,最终输出就只有前两列元素正确,后三列全为0。
修复方案
你可以选择任意一种写法修正,都能得到预期输出:
写法1:按行单独填充(逻辑最清晰,无冗余循环)
不需要嵌套循环填充,逐行拷贝对应数组即可:
int p[5] = {1, 2, 3, 4, 5}; int w[5] = {5, 4, 3, 2, 1}; int i, j; int m[2][5]; // 2行5列存储矩阵 printf("This is the instance you entered: \n\n"); printf("----------------------------------------- \n"); // 填充第0行(利润数组) for (j = 0; j < 5; j++) { m[0][j] = p[j]; } // 填充第1行(重量数组) for (j = 0; j < 5; j++) { m[1][j] = w[j]; } // 打印矩阵 for (i = 0; i < 2; i++) { for (j = 0; j < 5; j++) { printf("%d ", m[i][j]); } printf("\n"); }
写法2:修正原嵌套循环的下标对应关系
如果要保留两层嵌套遍历的结构,需要把列下标替换为内层循环变量j,按当前行号判断数据源:
// 填充矩阵 for (i = 0; i < 2; i++) // 遍历行 { for (j = 0; j < 5; j++) // 遍历列 { m[i][j] = (i == 0) ? p[j] : w[j]; } }
注意:写循环操作数组时,一定要确认循环变量和数组下标的对应关系,避免出现循环正常执行但下标没跟着迭代的无效逻辑,这类问题不会触发编译报错,只会出现逻辑结果异常。
内容的提问来源于stack exchange,提问作者Pegasus420
相关产品推荐
相关产品推荐

