You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

矩阵乘法实现遇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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:20:27