C语言矩阵乘法结果异常求助:输出值重复而非预期结果
问题分析与修复方案
错误原因
你的代码存在两个核心问题导致结果异常:
重复调用乘法函数+数组越界访问
在main的打印循环中,你每打印一个元素就调用一次multiMat,这会让矩阵乘法被重复执行4次。更严重的是,multiMat返回的matResult[i][j]中的i和j是函数内部的局部循环变量,循环结束后i=M=2、j=N=2,这已经超出了matResult数组的合法下标范围(数组下标从0到1),属于越界访问,返回的是不确定的内存值,你看到的重复值只是巧合。不必要的全局变量
全局的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
相关产品推荐
相关产品推荐

