Обнаружены две ошибки:
Вы не сбрасываете j = 0
во внешнем цикле умножения. Это приводит к тому, что он завершает только одну строку, если он вообще входит во внутренний цикл, поскольку его значение остается равным n1
после цикла выделения. Скорее всего, именно поэтому он возвращает вам все нули.
Во-вторых, вы также должны сбросить k во внешнем цикле. Когда условие j<n2
нарушается, i
увеличивается, но k
остается тем же значением, что и при завершении последнего цикла.
Я также не знаю, в чем смысл переменной chg, поскольку она ничего не делает.
И, как сказал TrustworthySystems, выделяйте память только один раз, иначе у вас будут утечки. Вот правильная функция:
int** multiply_matrices(int** matrix1, int** matrix2, int m1, int n1, int m2, int n2) {
if(n1 != m2) {
printf("error\n");
return NULL;
}
int i = 0;
int j = 0;
int k = 0;
int** product = (int**) malloc(m1 * sizeof(int*));
for(i = 0; i<m1; i++){
product[i] = (int*) malloc(n2 * sizeof(int));
for(j = 0; j<n1; j++){
product[i][j] = 0;
}
}
for(i = 0; i < m1; i++) {
int chg = 0;
j = 0;
k = 0;
while(j<n2){
if(k == n1 ){
k = 0;
j++;
}
product[i][j] += matrix1[i][k] * matrix2[k][j];
k++;
chg = 1;
}
}
return product;
}