为什么地址清理器会在我的乘法矩阵中引起堆缓冲区溢出错误?

时间:2019-10-23 01:53:40

标签: c heap address-sanitizer

错误是: heap-buffer-overflow 。 我正在运行一个将矩阵相乘的代码块。尝试将两个矩阵相乘时,地址清理器在特定行上向我抛出错误。在我的IDE上,没有错误或警告出现,但是,地址清理器在此处抛出错误,我不太清楚为什么。矩阵中有从用户扫描的条目,下面是代码无效的代码段。代码段地址清除器抛出错误,以粗体显示。谢谢。

摘要:

double **productMatrixT;

productMatrixT = (double **)malloc(rowT*sizeof(double));
for(i = 0; i < rowT; i++)
{
  productMatrixT[i] = malloc(column*sizeof(double));
}

double sum = 0;
for(i = 0; i < column; i++)
{
  for(j = 0; j < row; j++)
   {
     for(k = 0; k < rowT; k++)
      {
        **sum = sum + matrixT[i][k] * matrix[k][j];** <---- /*says this line is a cause for a problem*/
      }
       productMatrixT[i][j] = sum;
       sum = 0;
     }
  }
}

免费:

for(i = 0; i < rowT; i++)
{
 free(productMatrixT[i]);
}
free(productMatrixT);

2 个答案:

答案 0 :(得分:1)

关于:

double sum = 0;

由于已声明为double,因此应将其初始化为double,即。

double sum = 0.0;

关于:

**sum = sum + matrixT[i][k] * matrix[k][j];

由于'sum'是double而不是指向指针的指针,因此**的取消引用导致某些随机地址。这就是address sanitizer的抱怨。

正如其他人提到的那样,发布的代码还有很多其他错误。

答案 1 :(得分:0)

您的索引错误,

sum = sum + matrixT[i][k] * matrix[k][j];

您以matrixcolumn x rowT的身份访问rowT x row,但已将其分配为rowT x column

还应该修复

productMatrixT = (double **)malloc(rowT*sizeof(double));

成为

productMatrixT = (double **)malloc(rowT*sizeof(double *));