Почему средство очистки адреса вызывает ошибку переполнения буфера динамической памяти в моей матрице умножения? - PullRequest
0 голосов
/ 23 октября 2019

Ошибка: переполнение кучи-буфера . Я бегу блок кода, который умножает матрицы. Обеззараживатель адресов выдает ошибку в конкретной строке, пытаясь умножить две матрицы. В моей среде 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 ]

1 голос
/ 24 октября 2019

относительно:

double sum = 0;

, поскольку оно объявлено как double, его следует инициализировать как double, IE

double sum = 0.0;

относительно:

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

, поскольку sum является double, а не указателем на указатель, разыменование ** приводит к некоторому случайному адресу. Это то, на что address sanitizer жалуется.

Как уже упоминали другие, в опубликованном коде есть еще много неправильных.

0 голосов
/ 23 октября 2019

Ваша индексация неверна, в

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

вы получаете matrix как column x rowT и rowT x row, но вы выделили его как rowT x column.

Также выдолжно исправить

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

на

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