使用双指针开发矩阵操作库:矩阵分配代码故障排查
分析你的矩阵分配代码问题及修复方案
我帮你梳理下这段代码里的几个关键问题,正是这些问题导致程序无法正常运行:
1. 函数参数传递错误(核心问题)
你的matrix函数里,参数double **matrix是传值传递,函数内部对matrix的赋值只会修改形参,不会影响外部的P_M变量。这就导致外部的P_M始终是空指针,后续赋值操作必然触发内存错误。
解决办法:要么让函数返回分配好的double**指针,要么把参数改成double ***matrix(传递指针的指针)来实现修改外部变量的目的。
2. 数组下标越界
在main函数里,你用i从1到4、j从1到4去访问P_M[i][j],但C语言数组下标是从0开始的——你分配的是4行4列的矩阵,合法下标范围是0到3。这种越界访问会破坏内存,引发不可预料的错误。
3. show_matrix函数的两处错误
- 内层
for循环后面多了个分号;,导致循环体是空的,后面的printf只会执行一次,根本不会遍历打印矩阵元素 printf(" ",&matrix[i][j]);完全不符合格式要求:没有对应的格式说明符,而且打印double类型不需要取地址,正确写法应该是printf("%lf\t", matrix[i][j]);
4. 函数返回值不匹配
matrix函数声明返回double类型,但函数内部没有任何return语句,这会导致未定义行为,应该改成返回double**或者直接用void作为返回类型。
修复后的完整代码
#include <stdio.h> #include <math.h> #include <stdlib.h> static double P[4][4] = { {1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1} }; void show_matrix(int n, int m, double **matrix) { int i, j; printf("The matrix is:\n"); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { printf("%lf\t", matrix[i][j]); } printf("\n"); } } // 修改为返回分配好的double**指针,同时增加内存分配失败的判断 double** matrix(int n, int m) { int row; double **mat = malloc(sizeof(double*) * n); if (mat == NULL) { perror("malloc failed for rows"); exit(EXIT_FAILURE); } for (row = 0; row < n; row++) { mat[row] = malloc(sizeof(double) * m); if (mat[row] == NULL) { perror("malloc failed for columns"); // 已分配的内存要提前释放,避免内存泄漏 for (int k = 0; k < row; k++) { free(mat[k]); } free(mat); exit(EXIT_FAILURE); } } return mat; } int main() { // main标准返回类型是int,不是void int i, j; double **P_M = matrix(4, 4); // 接收函数返回的分配好的指针 // 用0开始的下标遍历赋值,避免越界 for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { P_M[i][j] = P[i][j]; } } show_matrix(4, 4, P_M); // 使用完动态内存后记得释放,避免内存泄漏 for (i = 0; i < 4; i++) { free(P_M[i]); } free(P_M); return 0; }
额外提醒:使用动态分配的内存后,一定要记得在不用的时候逐层释放,避免内存泄漏。添加内存分配失败的判断能让程序在极端情况下更健壮,不会直接崩溃。
内容的提问来源于stack exchange,提问作者Tupn
相关产品推荐
相关产品推荐

