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

使用二维数组实现矩阵乘法的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"); // 每行结束换行,输出更清晰
    }
}

关键修改点

  1. 调整函数参数顺序,先传递数组维度参数,再传递变长数组,让编译器能正确计算数组元素的内存偏移。
  2. 仅当矩阵维度合法(b == m)时才调用processMatrix,避免处理未初始化的数组。
  3. 给showMatrix添加换行逻辑,让结果矩阵的输出更易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:40:58