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

使用动态内存分配与void函数实现矩阵乘法的代码运行错误求助

矩阵乘法代码错误修复方案

错误原因

  • 二维数组内存分配逻辑错误
    三个矩阵的行空间分配循环终止条件全部错误:
    • mat1共有r1行,原代码循环判断条件写为i<c1,仅当矩阵为方阵时能分配正确的行数量,否则会出现少分配行空间、访问未初始化指针的问题,直接触发内存越界错误
    • mat2共有r2行,原代码循环判断条件写为i<c2,存在同样的越界风险
    • 结果矩阵mat3共有r1行、c2列,原代码循环判断条件写为i<c2,同样存在逻辑错误
      这是触发-1073741819 (0xC0000005)错误码的核心原因。
  • 乘法逻辑循环存在多余分号
    multiplication函数中,控制累加次数的t循环末尾多写了一个分号,导致循环体为空:循环执行完后t的值等于c1,后续的累加逻辑仅执行一次,且直接访问数组越界位置,累加逻辑完全没有生效,最终输出结果要么全为0,要么为内存中的垃圾值。

修复后的完整代码

#include <stdio.h>
#include <stdlib.h>

int r1, r2, c1, c2, **mat1, **mat2, **mat3, i, j, t;
void check(int c1, int r2);
void input();
void inputDisplay();
void multiplication(int **mat1,int **mat2);
void displayOutput(int **mat3);


int main()
{
    printf("enter the dimensions of first matrix\n");
    scanf("%d%d", &r1, &c1);
    printf("enter the dimensions of second matrix\n");
    scanf("%d%d", &r2, &c2);

    check(c1, r2);

    mat1 = (int **)malloc(r1*sizeof(int *));
    for(i=0; i<r1; i++) // 修复:循环次数为行数r1
    {
        mat1[i] =  (int *)malloc(c1*sizeof(int));
    }
    mat2 = (int **)malloc(r2*sizeof(int *));
    for(i=0; i<r2; i++) // 修复:循环次数为行数r2
    {
        mat2[i] = (int *)malloc(c2*sizeof(int));
    }
    mat3 = (int **)malloc(r1*sizeof(int *));
    for(i=0; i<r1; i++) // 修复:循环次数为结果矩阵行数r1
    {
        mat3[i] = (int *)malloc(c2*sizeof(int));
    }

    input();
    inputDisplay();
    multiplication(mat1, mat2);
    displayOutput(mat3);

    // 补充内存释放逻辑避免内存泄漏
    for(i=0; i<r1; i++) free(mat1[i]);
    free(mat1);
    for(i=0; i<r2; i++) free(mat2[i]);
    free(mat2);
    for(i=0; i<r1; i++) free(mat3[i]);
    free(mat3);

    return 0;
}

void check(int c1, int r2)
{
    if(c1 != r2)
    {
        printf("these two matrices are not compatible for multiplication");
        exit(EXIT_FAILURE);
    }
}

void input()
{
    printf("enter first matrix\n");
    for(i=0; i < r1; i++)
    {
        for(j=0; j<c1; j++)
        {
            printf("value of %d row and %d column:", i + 1, j +1);
            scanf("%d", &mat1[i][j]);
        }
    }
    printf("enter second matrix\n");
    for(i=0; i<r2; i++)
    {
        for(j=0; j<c2; j++)
        {
            printf("value of %d row and %d column:", i + 1, j +1);
            scanf("%d", &mat2[i][j]);
        }
    }
}

void inputDisplay()
{
    printf("first matrix is:");
    for(i=0; i<r1; i++)
    {
        printf("\n");
        for(j=0; j<c1; j++)
        {
            printf("%d\t", mat1[i][j]);
        }
    }
    printf("\nsecond matrix is:");
    for(i=0; i<r2; i++)
    {
        printf("\n");
        for(j=0; j<c2; j++)
        {
            printf("%d\t", mat2[i][j]);
        }
    }
}

void multiplication(int **mat1, int **mat2)
{
    for(i=0; i<r1; i++)
    {
        for(j=0; j<c2; j++)
        {
            mat3[i][j] = 0;
            for(t = 0; t < c1; t++) // 修复:删除末尾多余分号
            {
                mat3[i][j] += mat1[i][t]*mat2[t][j];
            }
        }
    }

}

void displayOutput(int **mat3)
{
    printf("\nresultant matrix is:");
    for(i=0; i<r1; i++)
    {
        printf("\n");
        for(j=0; j<c2; j++)
        {
          printf("%d\t", mat3[i][j]);
        }
    }
}

验证说明

使用你提供的2x2全1矩阵测试用例,修复后输出的结果矩阵为2x2全2,符合矩阵乘法计算预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 06:45:03