C语言矩阵计算代码逻辑错误:矩阵填充异常排查求助
解决固定尺寸矩阵填充与乘法异常问题
核心问题定位
- 手动打印第二行及以后元素为0,但display函数正常,大概率是手动打印时索引逻辑错误,或是填充矩阵时循环变量/边界设置错误(比如行、列循环顺序搞反,或循环范围不匹配输入尺寸)。
- 硬编码尺寸时乘法正常,说明动态输入尺寸后,填充过程未正确遍历所有元素。
正确的矩阵填充与验证代码示例
以下是符合要求(禁用指针/动态数组)的完整代码,重点修正填充与索引逻辑:
#include <stdio.h> #define MAX_SIZE 100 int matrix_A[MAX_SIZE][MAX_SIZE]; int matrix_B[MAX_SIZE][MAX_SIZE]; int matrix_C[MAX_SIZE][MAX_SIZE]; // 矩阵填充:严格按行、列顺序遍历赋值 void fillMatrix(int mat[MAX_SIZE][MAX_SIZE], int rows, int cols) { printf("输入 %d 行 %d 列的矩阵元素:\n", rows, cols); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { // 索引必须为行i、列j,不能颠倒 scanf("%d", &mat[i][j]); } } } // 矩阵打印(与填充逻辑一致) void displayMatrix(int mat[MAX_SIZE][MAX_SIZE], int rows, int cols) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", mat[i][j]); } printf("\n"); } } // 矩阵乘法(已确认无问题,保留原逻辑) void multiplyMatrices(int a[MAX_SIZE][MAX_SIZE], int b[MAX_SIZE][MAX_SIZE], int c[MAX_SIZE][MAX_SIZE], int a_rows, int a_cols, int b_cols) { // 初始化结果矩阵为0 for (int i = 0; i < a_rows; i++) { for (int j = 0; j < b_cols; j++) { c[i][j] = 0; for (int k = 0; k < a_cols; k++) { c[i][j] += a[i][k] * b[k][j]; } } } } int main() { int m, n, p; printf("输入矩阵A的行数m、列数n:"); scanf("%d %d", &m, &n); printf("输入矩阵B的列数p:"); scanf("%d", &p); fillMatrix(matrix_A, m, n); fillMatrix(matrix_B, n, p); // 手动打印验证:完全复用display的循环逻辑,避免索引错误 printf("\n手动验证矩阵A:\n"); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { printf("%d ", matrix_A[i][j]); } printf("\n"); } multiplyMatrices(matrix_A, matrix_B, matrix_C, m, n, p); printf("\n矩阵乘法结果:\n"); displayMatrix(matrix_C, m, p); return 0; }
关键错误排查点
- 填充索引顺序:若填充时写成
mat[j][i](行、列索引颠倒),当输入的行、列数不等时,会导致大量元素未被正确赋值,出现手动打印异常。 - 循环边界匹配:手动打印时若用错循环边界(比如把列数当成行数),会误打印未赋值的默认0元素。
- 输入格式问题:输入元素时若换行/空格不符合
scanf读取逻辑(比如连续多打换行),可能导致部分元素被误赋值为0。
验证步骤
- 填充后先用display函数打印,确认数据正确。
- 手动打印时完全复用display的循环逻辑,对比两者输出,若不一致则手动打印代码存在错误。
- 检查fillMatrix函数的循环变量,确保
i遍历行、j遍历列,索引为mat[i][j]。
内容的提问来源于stack exchange,提问作者Yaman Tariq
相关产品推荐
相关产品推荐

