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

C语言动态内存分配实现矩阵乘法出现段错误问题求助

核心错误原因

  • 二维指针内存分配逻辑错误:int** 类型代表行指针数组,仅需要分配「行数 × 指针类型大小」的空间,你代码中分配时多乘了列数,属于冗余错误。
  • 结果矩阵arr3未分配行内元素存储空间:你仅为arr3分配了行指针数组的内存,没有为每一行单独分配存储矩阵元素的内存,访问arr3[i][j]时操作野指针,是触发段错误的直接原因。
  • 内存释放逻辑不完整:仅释放了行指针数组的内存,没有提前释放每一行的元素内存,存在严重内存泄漏。
  • 你之前观察到的部分场景运行正常属于未定义行为的偶然表现,因为野指针刚好落在进程可访问的内存区间,并不代表代码逻辑正确。

修改方案

  1. 修正所有二维指针的分配逻辑,仅按行数分配行指针数组空间
  2. 结果矩阵arr3在分配行指针数组后,逐行分配对应列数的元素存储空间
  3. 补充完整的内存释放逻辑,先释放每行元素内存,再释放行指针数组

修复后完整代码

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

void create(int **arr,int r,int c)
{
    int i,j;
    for(i=0;i<r;i++)
    {
        arr[i]=(int*)malloc(sizeof(int)*c);
        for(j=0;j<c;j++)
            scanf("%d",*(arr+i)+j);
    }
}

void display(int **arr,int r,int c)
{
    int i,j;
    for(i=0;i<r;i++)
    {
        for(j=0;j<c;j++)
            printf("%d    ",*(*(arr+i)+j));
        printf("\n");
    }
}

void multiply(int **arr1,int **arr2,int **arr3,int r,int c1,int c2)
{
    int i,j,k;
    for(i=0;i<r;i++)
    {
        for(j=0;j<c2;j++)
        {
            arr3[i][j]=0;
            for(k=0;k<c1;k++)
                *(*(arr3+i)+j) += *(*(arr1+i)+k) * *(*(arr2+k)+j);
        }
    }
}

// 新增内存释放函数,避免重复代码
void free_matrix(int **arr, int r)
{
    int i;
    for(i=0; i<r; i++)
    {
        free(arr[i]);
    }
    free(arr);
}

int main()
{
    int **arr1,r1,c1,**arr2,r2,c2,**arr3;
    int i;

    printf("Enter rows and columns of first matrix: ");
    scanf("%d %d",&r1,&c1);
    // 修正分配逻辑,仅分配r1个int*大小的行指针数组
    arr1=(int**)malloc(sizeof(int*)*r1);
    printf("\nEnter elements of first matrix: ");
    create(arr1,r1,c1); 

    printf("\nThe first matrix is: \n");
    display(arr1,r1,c1);

    printf("\nEnter rows and columns of second matrix: ");
    scanf("%d %d",&r2,&c2);
    // 修正分配逻辑
    arr2=(int**)malloc(sizeof(int*)*r2);
    printf("\nEnter elements of second matrix: ");
    create(arr2,r2,c2); 

    printf("\nThe second matrix is: \n");
    display(arr2,r2,c2);

    if(c1!=r2)
    {
        printf("\nInvalid dimensions.");
        // 退出前释放已分配的内存
        free_matrix(arr1, r1);
        free_matrix(arr2, r2);
        exit(0);
    }

    // 修正arr3分配逻辑
    arr3=(int**)malloc(sizeof(int*)*r1);
    // 为arr3逐行分配元素存储空间
    for(i=0; i<r1; i++)
    {
        arr3[i] = (int*)malloc(sizeof(int)*c2);
    }

    printf("\nThe product is: \n");
    multiply(arr1,arr2,arr3,r1,c1,c2);
    display(arr3,r1,c2);

    // 释放所有矩阵内存
    free_matrix(arr1, r1);
    free_matrix(arr2, r2);
    free_matrix(arr3, r1);

    return 0;
}

内容的提问来源于stack exchange,提问作者145 BHASKAR BARMAN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:06:04