矩阵乘法实现遇Segmentation Fault:列向量输入报错求助
问题排查与修复方案
1. create_matrix 函数内存分配错误
这是触发段错误的核心原因:
numeric **create_matrix(int x, int y) { numeric **matrix = (numeric**)malloc(x * sizeof(numeric*)); // 错误:循环条件应为i < x(x是行数,需为每一行分配指针) for (int i = 0; i < y; i++) { matrix[i] = (numeric*)malloc(y * sizeof(numeric)); } return matrix; }
当创建2行1列的矩阵时,x=2、y=1,循环仅执行1次,仅为matrix[0]分配了列内存,matrix[1]是野指针。后续访问matrix[1][0]时直接触发段错误。
修复后代码:
numeric **create_matrix(int x, int y) { numeric **matrix = (numeric**)malloc(x * sizeof(numeric*)); if (matrix == NULL) { perror("malloc failed for rows"); exit(EXIT_FAILURE); } for (int i = 0; i < x; i++) { // 循环次数改为行数x matrix[i] = (numeric*)malloc(y * sizeof(numeric)); if (matrix[i] == NULL) { perror("malloc failed for columns"); // 释放已分配内存避免泄漏 for (int j = 0; j < i; j++) free(matrix[j]); free(matrix); exit(EXIT_FAILURE); } } return matrix; }
2. 矩阵乘法循环逻辑错误
原循环的边界和顺序完全不符合标准矩阵乘法规则:
for(int i = 0; i < m; i++) { for (int j = 0; j < n; j ++) { // j的边界错误,结果矩阵列数是l而非n for (int k = 0; k < l; k++) { // k的边界错误,应遍历第一个矩阵的列数n matrix_k[i][j] += matrix_a[i][k] * matrix_b[k][j]; } } }
标准矩阵乘法中,结果矩阵matrix_k为m×l,每个matrix_k[i][j]需累加matrix_a[i][k] * matrix_b[k][j](k从0到n-1,因第一个矩阵列数=第二个矩阵行数)。
修复后代码:
for(int i = 0; i < m; i++) { for (int j = 0; j < l; j ++) { // j遍历结果矩阵的列数l matrix_k[i][j] = 0; // 先清零,避免未初始化内存的垃圾值干扰 for (int k = 0; k < n; k++) { // k遍历第一个矩阵的列数n matrix_k[i][j] += matrix_a[i][k] * matrix_b[k][j]; } } }
3. 额外问题修复
- 内存泄漏:
main函数中matrix_x = create_matrix(m, l);分配的内存被后续赋值覆盖,直接删除该行即可,standard_matrix_multiplication会返回新分配的结果矩阵。 - 未初始化内存:
create_matrix分配的内存无初始值,乘法前必须给matrix_k元素清零(已在上面的循环修复中添加)。 - 转义符错误:原代码中
printf的需替换为\n,否则编译会报错。
测试验证
输入第一个矩阵2行1列、第二个矩阵1行2列(符合乘法规则:第一个矩阵列数=第二个矩阵行数),修复后的代码可正常运行,无段错误且计算结果正确。
内容的提问来源于stack exchange,提问作者user1085859
相关产品推荐
相关产品推荐

