Компилятор говорит, что в операторе ptr3[i] = ptr3[i] + ptr1[i] * ptr2[k];
бит, который говорит ptr1[i] * ptr2[k]
, пытается *
между двумя выражениями типа double*
.Другими словами, вам не разрешено умножать два указателя вместе.Чтобы сделать это правильно, вам нужно снова разыменовать ([i]
и [k]
уже разыменовывают от double**
до double*
).Чтобы это скомпилировать, нужно добавить следующее утверждение (я добавил скобки для ясности - они на самом деле не нужны):
*ptr3[i] = (*ptr3[i]) + (*ptr1[i]) * (*ptr2[k]);
Это должно привести к компиляции, но следующая проблема, которую вы запуститев это ошибка сегментации.Две строки над местом, где вы выполняете умножение, у вас есть это:
ptr3[i] = 0;
Это присваивает ptr3[i]
нулевой указатель , который совпадает с 0
в C (другие языки имеют другое имя этого значения: null
, None
и т. д.).Я думаю, что вы хотели сделать здесь:
*ptr3[i] = 0;
В качестве отступления, поскольку N
- известное фиксированное значение, вы можете не работать со всеми вещами malloc
просто сказав:
const int N = 500;
double ptr1[N][N];
double ptr2[N][N];
// ... and so on ...
Это объявляет ptr1
как массив вместо указателя, который идентичен указателю с точки зрения шаблонов доступа к памяти, но отличается по-разному .В зависимости от того, что вы пытаетесь выучить, отсутствие динамической памяти (использование malloc
и free
) может сэкономить вам немного головной боли.