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

C语言矩阵乘法结果异常求助:输出值重复而非预期结果

问题分析与修复方案

错误原因

你的代码存在两个核心问题导致结果异常:

  1. 重复调用乘法函数+数组越界访问
    在main的打印循环中,你每打印一个元素就调用一次multiMat,这会让矩阵乘法被重复执行4次。更严重的是,multiMat返回的matResult[i][j]中的i和j是函数内部的局部循环变量,循环结束后i=M=2、j=N=2,这已经超出了matResult数组的合法下标范围(数组下标从0到1),属于越界访问,返回的是不确定的内存值,你看到的重复值只是巧合。

  2. 不必要的全局变量
    全局的sum、i、j、k完全可以替换为函数内部的局部变量,全局变量容易引发意外的逻辑错误,不符合代码规范。

修复后的代码

#include <stdio.h>
#define M 2  // 第一个矩阵的行数/结果矩阵的行数
#define N 2  // 第一个矩阵的列数/第二个矩阵的行数
#define P 2  // 第二个矩阵的列数/结果矩阵的列数

/*
计算两个矩阵的乘积
mat1: M×N矩阵
mat2: N×P矩阵
matResult: 存储结果的M×P矩阵
*/
void multiMat(int mat1[M][N], int mat2[N][P], int matResult[M][P]) {
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < P; j++) {
            int sum = 0;  // 局部变量sum,每次计算元素前重置为0
            for (int k = 0; k < N; k++) {
                sum += mat1[i][k] * mat2[k][j];
            }
            matResult[i][j] = sum;
        }
    }
}

int main(void) {
    int mat1[M][N] = {{1, 2}, {3, 4}};
    int mat2[N][P] = {{9, 8}, {7, 6}};
    int matResult[M][P];

    // 先调用一次函数完成矩阵乘法计算
    multiMat(mat1, mat2, matResult);

    printf("\n\n  RESULT ");
    printf("\n  ===============\n");
    // 遍历结果矩阵打印
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < P; j++) {
            printf("     %d\t", matResult[i][j]);
        }
        printf("\n");
    }
    return 0;
}

修复说明

  • 将multiMat改为void类型,因为结果直接存入传入的matResult数组,无需返回值。
  • 在multiMat内部将sum定义为局部变量,每次计算新元素时自动初始化为0,避免全局变量的干扰。
  • 规范矩阵维度宏定义(新增P),符合矩阵乘法的维度要求:第一个矩阵的列数必须等于第二个矩阵的行数。
  • 在main中仅调用一次multiMat完成计算,再遍历matResult打印结果,避免重复计算和越界访问。

运行修复后的代码,会得到预期结果:

23  20
55  48

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:26:16