You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二维方阵转置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:31:28