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

C语言二维数组打印函数在main函数中调用无法正常输出问题求助

问题原因

    1. 内存分配语句运算符错误
      readMatrix函数中给二级指针分配内存的语句错用了相等判断符==,而不是赋值符=,导致malloc申请的内存地址根本没有赋值给mat变量,mat全程为未初始化的野指针:
    // 错误写法
    mat==(int**)malloc(lin*sizeof(int*));
    // 修正后
    mat = (int**)malloc(lin * sizeof(int*));
    
    1. 函数未返回有效指针
      readMatrix声明了int**类型的返回值,但函数执行结束后没有写return mat;语句,main函数中赋值得到的mat是随机垃圾值,访问该地址属于未定义行为,自然无法正常打印。
  • 额外优化项:readMatrix的第一个参数int** mat完全多余,你不需要从外部传入未初始化的野指针,直接在函数内部创建二级指针后返回即可。

修复后完整代码

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

void print(int** mat, int lin, int col) {
    int i,j;
    printf("Matrix is:\n");
    for(i=0; i<lin; i++) {
        for(j=0; j<col; j++) {
            printf("%d ", *(*(mat+i)+j));
        }
        printf("\n");
    }
}

int** readMatrix(int lin, int col) {
    int x;
    int i,j;
    // 修正运算符错误
    int** mat = (int**)malloc(lin*sizeof(int*));
    for(x=0; x<lin; x++) {
        mat[x]=(int*)malloc(col*sizeof(int));
    }
    
    for(i=0; i<lin; i++) {
        printf("Line %d: ", i);
        for(j=0; j<col; j++) {
            scanf("%d",  &mat[i][j]);
        }
    }
    // 补充返回值
    return mat;
}


int main()
{
    int lin, col;
    printf("Enter number of lines: ");
    scanf("%d", &lin);
    printf("Enter number of cols: ");
    scanf("%d", &col);
    // 调用时不需要传入mat参数
    int** mat = readMatrix(lin,col);
    print(mat,lin,col);
    
    // 补充内存释放逻辑,避免泄漏
    for(int i=0; i<lin; i++) {
        free(mat[i]);
    }
    free(mat);
    return 0;
}

为什么readMatrix内部调用print能正常运行

这是未定义行为的随机表现:你在readMatrix内部访问野指针时,刚好对应内存地址未被系统保护、可正常读写,所以可以临时打印内容,但函数返回后栈内存被回收,main拿到的垃圾地址无法访问,就会出现打印失败、甚至程序崩溃的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:15:03