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

C语言矩阵转置代码行数大于列数时输出错误问题求解

C语言矩阵转置代码错误排查与修复

核心错误点

  • 转置矩阵索引计算错误:转置后矩阵的维度是「原矩阵列数为行、原矩阵行数为列」,target的偏移量计算误用了原矩阵列数column作为行步长,应该用原矩阵行数row作为转置矩阵的行步长。
  • 输出逻辑错误:main函数中输出用的m、n未定义,输出偏移量计算错误,且循环边界和转置后的矩阵维度不匹配。
  • 函数前置声明缺失:transpose函数定义在main之后,调用前没有声明会触发编译警告。

错误原因说明

以异常测试用例为例:3行2列的原矩阵转置后应为2行3列。原代码中target[j * column + i]的column值为2,当j=0、i=2时偏移量为0*2+2=2,存入值5;后续j=1、i=0时偏移量为1*2+0=2,直接把之前存入的5覆盖,就出现了错误输出里重复的5。

修复后完整代码

#include <stdio.h>
#include <stdlib.h>

// transpose函数前置声明
void transpose(int row, int column, int* target, int* image);

int main() {
    int row, column, tmp;
    scanf("%d", &row);
    scanf("%d", &column);
    int *image = (int*)malloc(sizeof(int) * row * column);
    int *target = (int*)malloc(sizeof(int) * row * column);
    
    for(int i = 0; i < row; i++) {
        for(int j = 0; j < column; j++) {
            scanf("%d", &tmp);
            image[i * column + j] = tmp;
        }
    }
    
    transpose(row, column, target, image);
    // 转置后为column行row列,调整循环边界
    for (int i = 0; i < column; i++) {
        for (int j = 0; j < row; j++) {
            // 转置后每行有row个元素,步长改为row
            printf("%d\t", target[i * row + j]);
        }
        printf("\n");
    }
    // 释放动态申请的内存
    free(image);
    free(target);
    return 0;
}

void transpose(int row, int column, int* target, int* image) {
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < column; j++) {
            // 转置后第j行第i列的偏移为 j * 转置后列数(row) + i
            target[j * row + i] = image[i * column + j];
        }
    }
}

内容的提问来源于stack exchange,提问作者jad egbaria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:15:03