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

标签 c heap-memory address-sanitizer

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

double sum = 0.0;

关于:

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

由于“sum”是一个double,而不是指向指针的指针,因此**取消引用会产生一些随机地址。这就是地址清理程序所提示的。

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

关于c - 为什么地址清理程序会在我的乘法矩阵中导致堆缓冲区溢出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58514379/

相关文章:

c - 有人请解释一下 c 中的字符串吗?

c - C 中的堆分配

c - 段错误: Stack allocation in a C program in Ubuntu when bufffer>4M

c++ - 方法最开始的段错误

c - 发出 SIGINT 以停止循环时如何获取地址 sanitizer 的输出

c++ - 函数声明的数组大小导致堆栈损坏,但干净的编译?

c - MPI C 中的一般运行时间测量

c - 为什么 strcmp 或 strncmp 不适用于 C 编程语言?

支持mocking嵌套函数的C单元测试框架

java - Tomcat7 java.lang.OutOfMemoryError : Java heap space 错误