Причина, по которой, как уже отмечали другие, порядок оценки параметров функции - неопределенное поведение, и поэтому на него не следует полагаться. Но здесь есть еще одна, возможно, серьезная проблема:
Функция read_mat может получать доступ к статическим ресурсам, таким как статические / глобальные переменные, и затем возвращать их значения. Как это:
static int x;
int inc (void)
{
x++;
return x;
}
printf("%d %d", inc(), inc());
Фактический результат функции будет зависеть от порядка оценки.
(Этот фрагмент взят из собеседования, которое я использую при приеме на работу программистов на Си. Я спрашиваю, каков вывод этого кода, и правильный ответ - «2 1» или «1 2». Вопрос проверяет, знает ли программист C о понятиях статической инициализации и порядке вычисления.)