二维方阵转置C语言代码结果异常,请求问题排查
问题分析与修复
你的代码核心问题出在变长数组(VLA)的兼容性以及非方阵场景下的循环范围逻辑上,我们一步步拆解解决:
1. 变长数组的潜在问题
你在transpose2D函数中定义了int transpose[rowSize][colSize];,这是C99引入的变长数组特性,但并非所有编译器都默认支持(比如微软MSVC就不兼容VLA)。即使编译器支持,栈上分配的变长数组也可能因内存布局异常,导致转置后的内容无法正确存储,最终赋值回原数组时没有生效,所以输出和原矩阵完全一致。
解决方法很直接:利用你已经定义的SIZE宏,改用固定大小的数组存储转置结果——SIZE设为10,足够容纳最大10x10的矩阵:
int transpose[SIZE][SIZE]; // 替换原来的变长数组定义
2. 赋值循环的范围修正
虽然你的测试用例是4x4方阵(行列数相等),但为了让代码支持非方阵转置,赋值回原数组的循环范围需要匹配转置后的矩阵维度:转置后的矩阵是colSize行、rowSize列,所以循环应该遍历colSize行和rowSize列,而非原矩阵的行列数。
修改后的完整transpose2D函数如下:
void transpose2D(int ar[][SIZE], int rowSize, int colSize) { int transpose[SIZE][SIZE] ; int i , j ; // 完成转置:原矩阵i行j列 → 转置矩阵j行i列 for (i = 0 ; i < rowSize ; i++) { for (j = 0 ; j < colSize ; j++) { transpose[j][i] = ar[i][j] ; } } // 将转置结果赋值回原数组,循环范围匹配转置后的行列数 for (i = 0 ; i < colSize ; i++) { for (j = 0 ; j < rowSize ; j++) { ar[i][j] = transpose[i][j] ; } } }
3. 非方阵场景的额外优化(可选)
如果需要处理非方阵转置,还需要调整display函数的调用逻辑——因为转置后的矩阵行列数已经互换。比如在main函数中,调用display时要传入转置后的行列数:
// 原代码: // display(ar, rowSize, colSize); // 修改为: display(ar, colSize, rowSize);
如果只需要处理方阵,这一步可以忽略。
测试验证
用你提供的输入测试修改后的代码,就能得到预期的转置结果:
transpose2D(): 1 1 3 4 2 1 3 5 3 2 4 6 4 2 4 7
内容的提问来源于stack exchange,提问作者Joey Ngo
相关产品推荐
相关产品推荐

