Ну, вы не дали нам полную реализацию. Я полагаю, что вы имели в виду.
int **mat = (int **)malloc(rows * sizeof(int*));
for(int i = 0; i < rows; i++) mat[i] = (int *)malloc(cols * sizeof(int));
Вот еще один вариант:
int *mat = (int *)malloc(rows * cols * sizeof(int));
Затем вы моделируете матрицу, используя
int offset = i * cols + j;
// now mat[offset] corresponds to m(i, j)
для упорядочивания по ряду строк и
int offset = i + rows * j;
// not mat[offset] corresponds to m(i, j)
для заказа по столбцу.
Один из этих двух вариантов на самом деле является предпочтительным способом работы с матрицей на C. Это потому, что теперь матрица будет храниться непрерывно в памяти, и вы получите локальность ссылок . По сути, кэш процессора будет намного более счастливым с вами.