使用二维数组实现矩阵乘法的C程序输出垃圾值,求问题原因
矩阵乘法程序输出垃圾值的问题分析与修复
核心问题分析
二维数组参数类型不匹配
C语言中,当你把变长数组(VLA)int p[a][b]传递给声明为int p[][100]的函数时,数组的内存布局会被误解。函数期望第二维是固定的100,但实际传入的数组第二维是b,这会导致访问元素时计算内存偏移错误,读取到非法内存区域,产生垃圾值。非法维度时仍执行矩阵处理
当b != m(矩阵乘法要求第一个矩阵的列数等于第二个矩阵的行数),程序仅打印错误提示,但依然调用processMatrix。此时p和q的元素未被初始化,传入函数后会读取随机内存值,输出垃圾数据。showMatrix的参数同样存在维度不匹配
和processMatrix的问题一致,showMatrix声明的int c[][100]与传入的变长数组int c[a][n]维度不匹配,导致输出时内存访问错误。
修复方案
将所有涉及二维数组的函数参数改为**变长数组(VLA)**形式,同时在非法维度时跳过矩阵处理函数的调用:
修正后的代码
#include <stdio.h> // 使用变长数组声明函数参数 void readMatrix(); void processMatrix(int a, int b, int m, int n, int p[][b], int q[][n]); void showMatrix(int a, int n, int c[][n]); int main() { readMatrix(); return 0; } void readMatrix() { int i,j,m,n,a,b; printf("For matrix 1 \n"); printf("Enter the number of rows: "); scanf("%d",&a); printf("Enter the number of columns: "); scanf("%d",&b); printf("For matrix 2 \n"); printf("Enter the number of rows: "); scanf("%d",&m); printf("Enter the number of columns: "); scanf("%d",&n); int p[a][b]; int q[m][n]; if (b == m) { printf("For 1st Matrix\n"); for(i = 0;i<a;i++) { for(j = 0; j < b;j++) { printf("%d row %d column: ",i+1,j+1); scanf("%d",&p[i][j]); } } printf("For 2nd Matrix\n"); for(i = 0;i < m;i++) { for(j = 0; j < n;j++) { printf("%d row %d column: ",i+1,j+1); scanf("%d",&q[i][j]); } } // 仅在合法维度时调用处理函数 processMatrix(a, b, m, n, p, q); } else { printf("Enter a valid dimension. "); } } // 调整参数顺序,先传入维度,再传入对应变长数组 void processMatrix(int a, int b, int m, int n, int p[][b], int q[][n]) { int i,j,k; int c[a][n]; for(i=0;i < a;i++) { for(j = 0; j < n;j++) { c[i][j]=0; for(k = 0; k < b;k++) { c[i][j] += p[i][k] * q[k][j]; } } } showMatrix(a, n, c); } // 同样使用变长数组参数 void showMatrix(int a, int n, int c[][n]) { int i,j; printf("Result Matrix:\n"); for(i = 0; i < a; i++) { for(j = 0; j< n; j++) printf("%d ",c[i][j]); printf("\n"); // 每行结束换行,输出更清晰 } }
关键修改点
- 调整函数参数顺序,先传递数组维度参数,再传递变长数组,让编译器能正确计算数组元素的内存偏移。
- 仅当矩阵维度合法(
b == m)时才调用processMatrix,避免处理未初始化的数组。 - 给
showMatrix添加换行逻辑,让结果矩阵的输出更易读。
内容的提问来源于stack exchange,提问作者heisenberg
相关产品推荐
相关产品推荐

