二级指针实现矩阵乘法时scanf函数失效问题求助
解决你的矩阵乘法程序scanf崩溃问题
嘿,我一眼就瞅出问题所在了!你的程序没法接收输入还意外终止,核心原因是**allocate函数的指针传递逻辑错误**,导致mat1、mat2这些指针根本没被正确分配内存,后续read函数里的scanf访问了非法内存,触发了未定义行为。
为啥会这样?
C语言里函数参数是值传递,你现在的allocate函数参数是int **mat——这意味着你传给函数的是二级指针的一个副本。在函数内部给mat做malloc时,你只是修改了这个副本的指向,主函数里的原始指针(比如mat1)依然是未初始化的野指针。
你说之前求矩阵迹的程序用同样写法没问题?那大概率是那个程序里的矩阵是栈上静态分配的,或者你传递的是已经分配好内存的指针,不需要修改指针本身的指向,所以没暴露这个bug。
两种修复方案任你选
方案1:用三级指针修改原始指针
把allocate的参数改成int ***mat,这样就能在函数内部直接修改主函数里的二级指针:
void allocate(int ***mat,int m,int n) { int i; // 这里修改的是主函数里指针的指向 *mat = (int**)malloc(m*sizeof(int*)); for(i=0;i<m;i++) *(*mat+i) = (int*)malloc(n*sizeof(int)); }
主函数里调用时,要传指针的地址:
allocate(&mat1,m,n); allocate(&mat2,n,p); allocate(&prod,m,p);
方案2:让allocate返回分配好的指针(更直观)
这种写法避免了复杂的三级指针,代码可读性更好:
int** allocate(int m,int n) { int i; int** mat = (int**)malloc(m*sizeof(int*)); for(i=0;i<m;i++) // 用数组下标写法比指针偏移更易读 mat[i] = (int*)malloc(n*sizeof(int)); return mat; }
主函数里直接接收返回值:
mat1 = allocate(m,n); mat2 = allocate(n,p); prod = allocate(m,p);
额外的优化小建议
- 记得释放内存:动态分配的内存不用了要手动释放,不然会内存泄漏。可以加个释放函数:
void free_matrix(int **mat, int row_count) { for(int i=0; i<row_count; i++) { free(mat[i]); } free(mat); } // 在main函数return前调用 free_matrix(mat1, m); free_matrix(mat2, n); free_matrix(prod, m);
- 函数名
PRINT改成小写print更符合C语言的命名惯例(大写通常用于宏定义)。 - 可以给
malloc加个返回值检查,如果内存分配失败会返回NULL,加个判断能让程序更健壮:
int** allocate(int m,int n) { int i; int** mat = (int**)malloc(m*sizeof(int*)); if(mat == NULL) { printf("内存分配失败!\n"); exit(1); } for(i=0;i<m;i++) { mat[i] = (int*)malloc(n*sizeof(int)); if(mat[i] == NULL) { printf("内存分配失败!\n"); exit(1); } } return mat; }
内容的提问来源于stack exchange,提问作者Martund
相关产品推荐
相关产品推荐

