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

C语言中calloc分配二维数组时程序崩溃问题求助

C语言二维数组内存分配崩溃问题

我是C语言新手,尝试为二维数组分配内存,但程序执行到calloc时直接退出,换成malloc也无法解决。(注:本人是匈牙利人,部分文本为匈牙利语)

矩阵声明及函数调用方式

int** matrix = NULL;

matrixg(size, matrix);

函数相关代码部分

void matrixg(int* size,int** matrix2){

    //Mátrix mérete(矩阵大小)
    int k = 0;
    char szamseged[11];
    printf("How big should the matrix be? Under no cicumstance, type 0. (at least 1, maximum 20):\n");
    getchar();
    fgets(szamseged, 10, stdin);
    int meret = atoi(szamseged);
    while(meret == 0){
        if(k == 1){
            printf("I can do this all day.\n");
        }
        printf("Try again dummy!\n");
        getchar();
        fgets(szamseged, 10, stdin);
        meret = atoi(szamseged);
        k++;
    }
    *size = meret;

    *matrix2 = calloc((*size), sizeof(int*));
    for (int i = 0; i < (*size); i++) {
        printf("na ez jó."); //匈牙利语:这样就好
        matrix2[i] = calloc((*size), sizeof(int));
    }
}

问题原因及修复方案

1. 函数调用参数传递错误

原调用matrixg(size, matrix);中,第二个参数传递的是matrix的值(此时matrix是NULL),函数内部无法通过matrix2修改外部的matrix变量。必须传递matrix的地址,同时size参数也需传地址(否则无法修改外部size值),修改为:

matrixg(&size, &matrix);

2. 二维数组内存分配的索引错误

循环中matrix2[i] = calloc(...)是错误的:matrix2是int**类型,指向外部的int*指针(即matrix)。已经通过*matrix2 = calloc(...)分配了指针数组,此时应该操作这个指针数组的元素(*matrix2)[i],直接访问matrix2[i]会越界访问栈内存,导致程序崩溃。修复后的循环代码(增加内存分配失败判断):

*matrix2 = calloc((*size), sizeof(int*));
if (*matrix2 == NULL) {
    perror("calloc failed for pointer array");
    return;
}
for (int i = 0; i < (*size); i++) {
    printf("na ez jó.");
    (*matrix2)[i] = calloc((*size), sizeof(int));
    if ((*matrix2)[i] == NULL) {
        perror("calloc failed for row");
        // 释放已分配内存避免泄漏
        for (int j = 0; j < i; j++) {
            free((*matrix2)[j]);
        }
        free(*matrix2);
        *matrix2 = NULL;
        return;
    }
}

3. 输入处理的潜在问题

原代码中的getchar()可能导致异常:如果输入缓冲区无残留换行符,getchar()会等待用户输入一个字符,导致fgets读取内容缺失。建议替换为清空输入缓冲区的逻辑:

// 清空输入缓冲区
int c;
while ((c = getchar()) != '\n' && c != EOF);

printf("How big should the matrix be? Under no cicumstance, type 0. (at least 1, maximum 20):\n");
fgets(szamseged, sizeof(szamseged), stdin);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:17:24