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
相关产品推荐
相关产品推荐

