C 为什么地址消除器在乘法矩阵中导致堆缓冲区溢出错误?

C 为什么地址消除器在乘法矩阵中导致堆缓冲区溢出错误?,c,heap,address-sanitizer,C,Heap,Address Sanitizer,错误是:堆缓冲区溢出。 我正在运行一个矩阵相乘的代码块。地址消除器在尝试将两个矩阵相乘时,在特定行向我抛出一个错误。在我的IDE上,没有显示错误或警告,但是,地址消毒剂在这里抛出了一个错误,我不太确定为什么。矩阵中有用户扫描的条目,下面是一段不起作用的代码。正在引发错误的代码段地址清理程序以粗体显示。谢谢 片段: double **productMatrixT; productMatrixT = (double **)malloc(rowT*sizeof(double)); for(i = 0

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

免费:


你的索引是错误的

sum = sum + matrixT[i][k] * matrix[k][j];
您以列x行和行x行的形式访问矩阵,但已将其分配为行x列

你也应该修复

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

关于:

double sum = 0;
**sum = sum + matrixT[i][k] * matrix[k][j];
因为它被声明为double,所以应该初始化为double,即

关于:

double sum = 0;
**sum = sum + matrixT[i][k] * matrix[k][j];
由于“sum”是双精度的,而不是指向指针的指针,因此**解引用会产生一些随机地址。这就是地址消毒剂所抱怨的


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

productMatrixT=double**mallocrowT*sizeofdouble;应为productMatrixT=mallocrowT*sizeofdouble*;,或者更好的是productMatrixT=mallocrowT*sizeof*productMatrixT;不需要演员阵容。请注意,您并不是在创建二维矩阵,而是在创建指向一维矩阵的指针数组。要分配一个真正的多维矩阵,请参见您在productMatrixT中将空间分配为rowT x rowT矩阵,但将其作为列x row矩阵访问。@1201程序我的朋友告诉我,我应该释放第一个malloc中的任何部分,例如rowT,但从您的响应来看,我假设我释放了我首先访问的任何部分?您的free没有问题,既然你免费分配了你分配的东西。问题是我从0到列运行,您使用它作为productMatrixT[i]的第一个下标,但您只为productMatrixT分配了rowT元素。如果列>行,您将遇到问题。对于求和行也是如此,但您没有显示矩阵和矩阵文本的大小。@1201程序对于新手提出的问题,我很抱歉,但我如何才能解决它?我试图在第一个malloc和循环以及其他参数中混用参数来分配足够的空间列,但它似乎不起作用
**sum = sum + matrixT[i][k] * matrix[k][j];