Очевидная ошибка заключается в том, что вы разыменовываете c + i * b_cols
, в то время как c является массивом указателей размера a_rows
.Скорее всего, c + i * b_cols
находится за пределами области, которую вы ранее выделяли с помощью malloc()
.
. Я бы предложил упростить представление матрицы, используя один массив double
с размером, равным общему числуэлементы, т.е. строки * столбцы.
Например:
double *c;
c = malloc(sizeof(double) * a_rows * b_cols);
Это не только повышает общую производительность, но и упрощает код.Затем вам придется «линеаризовать» смещение внутри вашего одномерного массива для преобразования из двумерных координат матрицы.Например:
c[i * b_cols + j] = ...
Конечно, две другие матрицы нужно распределять, заполнять и получать к ним доступ аналогичным образом.
Для ясности кода я бы также заменил while
операторы for
операторы с фактической переменной, на которой они зациклены.Например:
for (i = 0; i < a_rows; i++)
for (j = 0; j < b_cols; j++)
for (k = 0; k < a_cols; k++)
Вы можете (ab) использовать язык Си разными способами, но хитрость заключается в том, чтобы в первую очередь сделать его более понятным для вас.