I created this small library to perform basic arithmetic on matrices. I have written the code, and it runs fine. Is there any unexpected behavior or memory leaks? Any room for improvement?
#include <stdio.h>
#include <stdlib.h>
typedef struct {
    int m;                  // rows
    int n;                  // columns
    int* elements;
} matrix_t;
matrix_t* create_matrix(int m, int n) {
    matrix_t* new_matrix = malloc(sizeof(matrix_t));
    new_matrix->m = m;
    new_matrix->n = n;
    new_matrix->elements = malloc(sizeof(int) * m * n);
    for (int i = 0; i < m * n; i++)
        new_matrix->elements[i] = 0;
    return new_matrix;
}
matrix_t* multiply_matrix(matrix_t** first, matrix_t** second) {
    if (first == NULL || second == NULL) return NULL;
    if ((*first)->n != (*second)->m) return NULL;
    matrix_t* product = create_matrix((*first)->m, (*second)->n);
    for (int i = 0; i < (*first)->m; i++) {
        for (int j = 0; j < (*second)->n; j++) {
            for (int k = 0; k < (*second)->m; k++)
                product->elements[j + i * product->n] +=
                    (*first)->elements[k + i * (*first)->n] * (*second)->elements[j + k * (*second)->n];
        }
    }
    return product;
}
matrix_t* add_matrix(matrix_t** first, matrix_t** second) {
    if (first == NULL || second == NULL) return NULL;
    if ((*first)->m != (*second)->m && (*first)->n != (*second)->n) return NULL;
    matrix_t* sum = create_matrix((*first)->m, (*first)->n);
    for (int i = 0; i < sum->n; i++)
        for (int j = 0; j < sum->m; j++)
            sum->elements[j + i * sum->n] =
                (*first)->elements[j + i * (*first)->n] + (*second)->elements[j + i * (*second)->n];
    return sum;
}
void print_matrix(matrix_t** mat) {
    if (mat == NULL) return;
    for (int i = 0; i < (*mat)->m; i++) {
        for (int j = 0; j < (*mat)->n; j++)
            printf("%5d", (*mat)->elements[j + i * (*mat)->n]);
        puts("");
    }
}
    
int. I'd expect adouble. \$\endgroup\$ultiply_matrix(matrix_t** first, matrix_t** second)instead ofultiply_matrix(matrix_t* first, matrix_t* second)? \$\endgroup\$