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

二级指针实现矩阵乘法时scanf函数失效问题求助

解决你的矩阵乘法程序scanf崩溃问题

嘿,我一眼就瞅出问题所在了!你的程序没法接收输入还意外终止,核心原因是**allocate函数的指针传递逻辑错误**,导致mat1、mat2这些指针根本没被正确分配内存,后续read函数里的scanf访问了非法内存,触发了未定义行为。

为啥会这样?

C语言里函数参数是值传递,你现在的allocate函数参数是int **mat——这意味着你传给函数的是二级指针的一个副本。在函数内部给mat做malloc时,你只是修改了这个副本的指向,主函数里的原始指针(比如mat1)依然是未初始化的野指针。

你说之前求矩阵迹的程序用同样写法没问题?那大概率是那个程序里的矩阵是栈上静态分配的,或者你传递的是已经分配好内存的指针,不需要修改指针本身的指向,所以没暴露这个bug。

两种修复方案任你选

方案1:用三级指针修改原始指针

把allocate的参数改成int ***mat,这样就能在函数内部直接修改主函数里的二级指针:

void allocate(int ***mat,int m,int n) {
    int i;
    // 这里修改的是主函数里指针的指向
    *mat = (int**)malloc(m*sizeof(int*));
    for(i=0;i<m;i++)
        *(*mat+i) = (int*)malloc(n*sizeof(int));
}

主函数里调用时,要传指针的地址:

allocate(&mat1,m,n);
allocate(&mat2,n,p);
allocate(&prod,m,p);

方案2:让allocate返回分配好的指针(更直观)

这种写法避免了复杂的三级指针,代码可读性更好:

int** allocate(int m,int n) {
    int i;
    int** mat = (int**)malloc(m*sizeof(int*));
    for(i=0;i<m;i++)
        // 用数组下标写法比指针偏移更易读
        mat[i] = (int*)malloc(n*sizeof(int));
    return mat;
}

主函数里直接接收返回值:

mat1 = allocate(m,n);
mat2 = allocate(n,p);
prod = allocate(m,p);

额外的优化小建议

  • 记得释放内存:动态分配的内存不用了要手动释放,不然会内存泄漏。可以加个释放函数:
void free_matrix(int **mat, int row_count) {
    for(int i=0; i<row_count; i++) {
        free(mat[i]);
    }
    free(mat);
}

// 在main函数return前调用
free_matrix(mat1, m);
free_matrix(mat2, n);
free_matrix(prod, m);
  • 函数名PRINT改成小写print更符合C语言的命名惯例(大写通常用于宏定义)。
  • 可以给malloc加个返回值检查,如果内存分配失败会返回NULL,加个判断能让程序更健壮:
int** allocate(int m,int n) {
    int i;
    int** mat = (int**)malloc(m*sizeof(int*));
    if(mat == NULL) {
        printf("内存分配失败!\n");
        exit(1);
    }
    for(i=0;i<m;i++) {
        mat[i] = (int*)malloc(n*sizeof(int));
        if(mat[i] == NULL) {
            printf("内存分配失败!\n");
            exit(1);
        }
    }
    return mat;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:37:46