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]的位置。
在循环过程中:
- 每次进入j循环,都会先把
C[i][j]清零,但后续的累加操作完全没有用到这个位置; - 所有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
相关产品推荐
相关产品推荐

