C语言二维动态数组无法打印内容,求行列式计算程序问题排查
二维动态数组实现问题的修复方案
我帮你揪出代码里的核心问题啦!你的程序能编译但没法输出内容,根源是二维动态数组的内存分配步骤完全错了,导致访问了非法内存空间,触发了未定义行为(比如程序悄悄崩溃或者输出乱码)。咱们一步步拆解问题和修复方法:
核心问题1:顶层内存分配的类型错误
你写的这行代码:
arDet = (int**)malloc(sizeof(int)*size);
arDet是int**类型(指向int指针的指针),所以每个元素应该是int*的大小,不是int的大小。正确的写法应该是:
arDet = malloc(sizeof(int*) * size);
(注:C语言里不需要强制转换malloc的返回值,不过如果习惯加也没问题,关键是类型要匹配)
核心问题2:缺少每行的内存分配
你只给顶层的指针数组分配了空间,但每个arDet[i]还是野指针,没有指向实际存储int数据的数组空间。所以必须在第一个for循环里,给每一行单独分配内存:
for(i = 0 ; i < size; i++) { // 先给第i行分配size个int的存储空间 arDet[i] = malloc(sizeof(int) * size); for(j = 0 ; j < size; j++) { scanf("%d", &arDet[i][j]); } }
额外的优化建议(非致命但能让代码更健壮)
- 尽量避免全局变量:你把
size、i、j这些变量都设成全局的,容易引发意外的变量值覆盖问题,改成局部变量更安全。 - 修复函数返回值问题:
input()声明的返回类型是int,但函数里没有return语句,这会导致未定义行为,建议改成void input()或者返回一个状态码。 - 修正3阶行列式的计算逻辑:你注释里用了一维数组的索引(比如
arDet[4]),但arDet是二维数组,应该用arDet[1][1]这种二维索引形式。 - 记得释放内存:动态分配的内存不用了要手动释放,避免内存泄漏。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> // 把size和arDet通过指针传递,避免全局变量 void input(int *size, int ***arDet) { do { scanf("%d", size); } while(*size > 3 || *size < 2); // 分配顶层指针数组,增加malloc失败检查 *arDet = malloc(sizeof(int*) * *size); if(*arDet == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } for(int i = 0 ; i < *size; i++) { // 分配每行的int数组,增加失败检查 (*arDet)[i] = malloc(sizeof(int) * *size); if((*arDet)[i] == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } for(int j = 0 ; j < *size; j++) { scanf("%d", &(*arDet)[i][j]); } } } int main() { int size; int **arDet = NULL; input(&size, &arDet); if(size == 2) { int det = arDet[0][0]*arDet[1][1] - arDet[0][1]*arDet[1][0]; printf("%d\n", det); } else if(size == 3) { // 修正3阶行列式的计算逻辑 int det = arDet[0][0]*(arDet[1][1]*arDet[2][2] - arDet[1][2]*arDet[2][1]) - arDet[0][1]*(arDet[1][0]*arDet[2][2] - arDet[1][2]*arDet[2][0]) + arDet[0][2]*(arDet[1][0]*arDet[2][1] - arDet[1][1]*arDet[2][0]); printf("%d\n", det); } else { fprintf(stderr, "Invalid size\n"); return -1; } // 释放动态分配的内存 for(int i = 0; i < size; i++) { free(arDet[i]); } free(arDet); return 0; }
现在你运行这个代码,输入2或3阶矩阵的大小和元素,就能正常输出行列式结果啦!
内容的提问来源于stack exchange,提问作者DionGR
相关产品推荐
相关产品推荐

