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

C++指针算术实现矩阵乘法结果错误,求问题排查

C++指针算术实现矩阵乘法结果错误的排查与修复

问题重现

尝试用指针算术实现矩阵乘法,但输出结果不符合预期。以下是实现代码:

#include <iostream>
#include <vector>

void multiply_matrices(int* A, int* B, int* C, int n) {
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            *(C + i * n + j) = 0; // Clear the element in C
            for (int k = 0; k < n; ++k) {
                *(C + i * n) += *(A + i * n + k) * *(B + k * n + j);
            }
        }
    }
}

int main() {
    int n = 3;
    int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int B[] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
    int C[9] = {0};  // Resultant matrix

    multiply_matrices(A, B, C, n);

    std::cout << "Matrix C (result):\n";
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            std::cout << *(C + i * n + j) << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

错误输出

Matrix C (result):
72 0 0 
207 0 0
342 0 0

预期输出

Matrix C (result):
30 24 18
84 69 54
138 114 90

错误原因分析

核心问题出在multiply_matrices函数的内层累加语句:

*(C + i * n) += *(A + i * n + k) * *(B + k * n + j);

这里的*(C + i * n)指向的是矩阵C第i行的第一个元素(即C[i][0]),但按照矩阵乘法的逻辑,我们需要将乘积累加到C[i][j]的位置。

在循环过程中:

  1. 每次进入j循环,都会先把C[i][j]清零,但后续的累加操作完全没有用到这个位置;
  2. 所有j对应的乘积项都被累加到了C[i][0],导致第一列的数值是该行所有列的正确结果之和,而其他列因为只被清零却没有被赋值,保持为0。

比如i=0时,j从0到2,三次循环的累加都会往C[0][0]加值,最终得到30+24+18=72,和错误输出一致。

修复方法

只需要将累加语句中的指针定位修正为C[i][j]的位置即可,也就是把*(C + i * n)改为*(C + i * n + j):

修复后的multiply_matrices函数:

void multiply_matrices(int* A, int* B, int* C, int n) {
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            *(C + i * n + j) = 0; // Clear the element in C
            for (int k = 0; k < n; ++k) {
                // 修正指针定位,指向C[i][j]
                *(C + i * n + j) += *(A + i * n + k) * *(B + k * n + j);
            }
        }
    }
}

运行修复后的代码,输出将与预期结果一致。

内容的提问来源于stack exchange,提问作者AstralHex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:53:13