C语言4×5转5×4矩阵转置输出异常问题排查
解决4×5矩阵转置时最后一行结果错误的问题
嘿,这个问题我之前也踩过一模一样的坑!核心原因就是你忽略了C语言数组的下标是从0开始的,你的循环从1开始遍历,直接导致了数组越界访问,最后一行的异常值其实是未初始化的内存垃圾数据。
咱们一步步拆解问题:
- 你的原矩阵
original[4][5],合法的行下标是0~3(共4行),列下标是0~4(共5列);转置后的transpose[5][4],合法行下标是0~4(5行),列下标是0~3(4列)。 - 你原来的循环用
ROW = 1; ROW <=4,当ROW=4时,已经超出了原矩阵的行范围,访问的是数组之外的内存;同理COL=5也超出了列范围。这些越界访问的位置值是随机的,所以最后一行出现了1251这种奇怪的数。 - 打印循环里的
row<6(也就是遍历15)和`col<5`(14)也同样越界,没正确遍历转置后的数组。
给你修正后的完整代码:
修正后的转置函数
int MATRANS(int original[4][5], int transpose[5][4]) { int ROW, COL; // 从0开始遍历原矩阵的4行(0到3) for (ROW = 0; ROW < 4; ROW++) { // 从0开始遍历原矩阵的5列(0到4) for (COL = 0; COL < 5; COL++) { // 正确映射转置关系:原矩阵[行][列] → 转置矩阵[列][行] transpose[COL][ROW] = original[ROW][COL]; } } // 补充返回值,符合函数声明的int类型 return 0; }
修正后的打印代码
printf("Transposed Matrix:\n"); // 遍历转置矩阵的5行(0到4) for (int row = 0; row < 5; row++) { // 遍历转置矩阵的4列(0到3) for (int col = 0; col < 4; col++) { // 这里要确保变量名和你定义的转置数组一致,原代码的matrixZ改成transpose即可 printf("%d ", transpose[row][col]); } printf("\n"); }
几个额外的小提醒:
- 一定要记住C数组的下标从0开始,这是新手最容易犯的错误之一;
- 原函数
MATRANS声明了返回int但没有返回值,补充return 0让代码更规范; - 打印时要保证变量名和转置后的数组一致,避免出现未定义的变量问题。
这样修改后,当你输入全为1的矩阵时,输出就会是你预期的5行全1的结果啦!
内容的提问来源于stack exchange,提问作者astroj
相关产品推荐
相关产品推荐

