C语言通过嵌套循环实现矩阵乘法代码运行异常求助
C语言矩阵乘法代码问题排查与修正
核心问题汇总
- 变长数组定义顺序错误:C语言中变长数组(VLA)的大小在定义时就确定,你在
k/m/l都为0的时候就定义了三个矩阵,后续修改维度变量不会更新数组大小,数组实际长度为0,访问直接越界触发崩溃。 - 第二个矩阵维度输入错误:输入第二个矩阵维度时,错误地把值写到了
k和m变量中,覆盖了第一个矩阵的维度,也没有给第二个矩阵的列数l赋值,导致l全程为0,后续循环逻辑完全错误。 - 第二个矩阵存储对象错误:录入第二个矩阵元素时,错误地写入了第一个矩阵
a的地址,直接覆盖了第一个矩阵的原有数据,也没有写入目标数组a1。 - 结果打印逻辑错误:打印结果时下标错误使用了固定的
k/l而非循环变量i/j,输出标识也错误写为a而非结果矩阵c。
修正后完整代码
#include <stdio.h> int main() { int k=0,m=0,l=0,s=0; // 先输入维度,再定义变长数组 printf("Enter the dimension of first matrix (row and column)>> \n"); scanf("%d%d",&k,&m); printf("Enter the dimension of second matrix (row and column)>> \n"); // 第二个矩阵的行必须等于第一个矩阵的列m,先读取再做合法性校验 int a1_row; scanf("%d%d",&a1_row,&l); if(a1_row != m) { printf("Matrix dimension mismatch: first matrix column must equal second matrix row!\n"); return 1; } // 维度确认后再定义数组 int a[k][m],a1[m][l],c[k][l]; printf("First matrix elements are inputted from below >> \n"); for (int i = 0; i < k ; i++) { for (int j = 0; j < m; j++) { printf("a[%d][%d]>> ",i,j); scanf("%d",&a[i][j]); } printf("\n"); } printf("Second matrix elements are inputted from below >> \n"); for (int i = 0; i < m ; i++) { for (int j = 0; j < l; j++) { // 正确存储到a1数组,提示同步修改 printf("a1[%d][%d]>> ",i,j); scanf("%d",&a1[i][j]); } printf("\n"); } // 矩阵乘法逻辑 for (int i = 0; i < k; i++) { for (int j = 0; j < l; j++) { s=0; for (int jj = 0; jj < m; jj++) { s+=a[i][jj]*a1[jj][j]; } c[i][j]=s; } } // 输出结果 printf("Result matrix c[k][l]: \n"); for (int i = 0; i < k ; i++) { for (int j = 0; j < l; j++) { // 用循环变量i,j作为下标,正确输出c矩阵 printf("c[%d][%d] = %d ",i,j,c[i][j]); } printf("\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Shay
相关产品推荐
相关产品推荐

