C++二维矩阵赋值使用+=出现异常的原因解析
矩阵乘法代码修复原因解析
核心问题出在未初始化内存的不确定值:
- C++中,直接声明的二维数组(如
int res[n1][n3];)若不初始化,数组内的每个元素会保留内存中的随机垃圾值,也就是你看到的“乱码”。 - 当直接执行
res[i][j] += a[i][k] * b[k][j]时,本质是把随机垃圾值与矩阵乘积的计算值相加,最终结果自然是错误的随机数。
而修复方式有效的原因很直接:
- 先初始化临时变量
val为0,每次计算矩阵元素时,从0开始累加所有a[i][k] * b[k][j]的结果,最后将val赋值给res[i][j]。 - 这种方式给每个元素的计算提供了确定的起始值(0),完全避开了未初始化数组的垃圾值干扰,最终得到的就是正确的矩阵乘积结果。
举个简单的代码逻辑对比:
错误写法的执行逻辑:
int res[2][2]; // 元素为随机值,比如res[0][0] = 12345 res[0][0] += a[0][0]*b[0][0] + a[0][1]*b[1][0]; // 结果 = 12345 + 正确乘积值,完全错误
正确写法的执行逻辑:
int res[2][2]; int val = 0; val += a[0][0]*b[0][0]; val += a[0][1]*b[1][0]; res[0][0] = val; // 结果 = 正确乘积和,与垃圾值无关
额外补充:更规范的做法是直接将整个res数组初始化为0(比如静态数组用int res[n1][n3] = {0};),但你用临时变量的方式,本质是绕开了未初始化的数组元素,从干净的起始值开始计算,因此同样能解决问题。
内容的提问来源于stack exchange,提问作者Akshat Shahjade
相关产品推荐
相关产品推荐

