如何从函数返回动态分配的二维矩阵?代码调用异常排查
分析你的二维数组输入函数崩溃问题
你的代码里有三个关键错误,直接导致了程序触发未定义行为(无提示崩溃退出),我来逐个拆解并给出修正方案:
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
相关产品推荐
相关产品推荐

