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

C语言中动态二维数组(矩阵)行数大于列数时崩溃求助

C语言动态二维数组行数大于列数时崩溃的解决方法

你的代码崩溃的核心原因是行指针分配的循环条件错误:

你用calloc申请了r个int*类型的行指针,但后续给行指针分配列空间时,循环条件写成了i < c,这就导致只有前c个行指针被正确分配了内存。当行数r大于列数c时,第c到r-1个行指针都是calloc初始化的空指针(NULL),后续访问a[i][j]时就会触发空指针解引用,直接导致程序崩溃。

修正后的完整代码

// 创建自定义大小的矩阵、输入元素并显示内容
#include<stdio.h>
#include<stdlib.h>
void display(int**, int, int);

int main()
{
    int **a, r, c, i, j;
    printf("输入矩阵的行数\n");
    scanf("%d", &r);
    printf("输入矩阵的列数\n");
    scanf("%d", &c);
    
    // 分配r个行指针
    a = (int**)calloc(r, sizeof(int*));
    // 循环条件改为i < r,为每一行分配列空间
    for(i = 0; i < r; i++)
    {
        a[i] = (int*)calloc(c, sizeof(int));
    }
    
    printf("输入矩阵元素\n");
    for(i = 0; i < r; i++)
    {
        for(j = 0; j < c; j++)
        {
            printf("输入元素(%d,%d)\n", i+1, j+1);
            scanf("%d", &a[i][j]);
        }
    }
    
    printf("矩阵内容:\n");
    display(a, r, c);
    
    // 补充:手动释放动态分配的内存,避免内存泄漏
    for(i = 0; i < r; i++)
    {
        free(a[i]);
    }
    free(a);
    
    return 0;
}

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\t", arr[i][j]);
        }
        printf("\n");
    }
}

关键修正点

  • 将行指针分配的循环条件从i < c改为i < r,确保每一行都能得到对应的列内存空间。
  • 补充了内存释放代码,养成手动回收动态内存的规范习惯(虽然程序结束后系统会自动回收,但手动释放能避免长期运行时的内存泄漏问题)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:57:17