繁体   English   中英

为什么地址清理程序会在我的乘法矩阵中导致堆缓冲区溢出错误?

[英]Why is address-sanitizer causing a heap-buffer-overflow error in my multiplication matrix?

错误是:堆缓冲区溢出 我正在运行一个将矩阵相乘的代码块。 地址清理程序在尝试将两个矩阵相乘时在特定行向我抛出错误。 在我的 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);

关于:

double sum = 0;

由于它被声明为double ,因此应将其初始化为double ,即 IE

double sum = 0.0;

关于:

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

由于“和”是double而不是指向指针的指针,因此**取消引用会产生一些随机地址。 这就是address sanitizer程序所抱怨的。

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

你的索引是错误的,在

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

您将matrix作为column x rowTrowT x row访问,但您已将其分配为rowT x column

你也应该修复

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

成为

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM