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

如何从函数返回动态分配的二维矩阵?代码调用异常排查

分析你的二维数组输入函数崩溃问题

你的代码里有三个关键错误,直接导致了程序触发未定义行为(无提示崩溃退出),我来逐个拆解并给出修正方案:

1. 字符串打印时的指针解引用错误

你写的:

printf("\n%s \n", *message);

这里message是const char*类型的字符串指针,*message会取字符串的第一个字符(char类型),但printf的%s格式符需要的是字符串的起始地址(char*)。把单个字符当作地址传递给%s,会直接引发非法内存访问,程序瞬间崩溃。

修正成:

printf("\n%s \n", message);

2. 行指针分配的循环次数错误

你给每行分配内存的循环:

for (int a = 0; a < column; a++)
    *(matrix + a) = (int *)calloc(column, sizeof(int));

这里循环条件是a < column,但我们需要给每一行分配指针,正确的循环次数应该是row(行数),而不是column(列数)。哪怕你这次调用时row和column数值相同,这个逻辑也是错误的——如果后续调用时两者数值不同,会导致要么少分配行指针,要么越界访问matrix数组,必然触发崩溃。

修正成:

for (int a = 0; a < row; a++)
    *(matrix + a) = (int *)calloc(column, sizeof(int));

3. scanf的地址参数错误

你读取输入的代码:

scanf("%d", ((matrix + r) + c));

matrix是int**类型,matrix + r是第r行指针的地址(int**类型),(matrix + r) + c会把这个地址再偏移c * sizeof(int*)字节,这根本不是你要存储的int元素的地址。正确的做法是先拿到第r行的数组指针(*(matrix + r)或者matrix[r]),再偏移c个int的位置,得到元素的地址。

修正成以下任意一种写法都可以:

// 写法1:用数组下标,最直观易读
scanf("%d", &matrix[r][c]);
// 写法2:用指针运算,和你原代码风格保持一致
scanf("%d", *(matrix + r) + c);

修正后的完整代码

把以上错误都修复后,你的函数应该可以正常工作了:

int **input(const int row, const int column, const char *message) {
    printf("\n%s \n", message);
    int **matrix = (int **)calloc(row, sizeof(int *));
    for (int a = 0; a < row; a++)
        *(matrix + a) = (int *)calloc(column, sizeof(int));
    /* scanf */
    for (int r = 0; r < row; r++) {
        for (int c = 0; c < column; c++) {
            printf("E[%d][%d]: ", r + 1, c + 1);
            scanf("%d", &matrix[r][c]);
        }
    }
    /* endscanf */
    return matrix;
}

额外提醒:使用完动态分配的二维数组后,记得要逐层释放内存(先释放每行的数组,再释放行指针数组),避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:02:43