void ucitajmatricu (int n) {
...
int MAT [n] [n];
...
void ispisimatricu (int n) {
int i, j, MAT [n] [n];
Два объявления MAT [] [] находятся в разных функциях - они делаютне сохраняют свое значение и тот факт, что они имеют одно и то же имя, не имеет значения.
Объявите MAT [] [] один раз, вне функции.И, кстати, эта проблема, кажется, не имеет никакого отношения к названию вопроса.
РЕДАКТИРОВАТЬ после комментария
Программа, кажется, работает только частично, потому что при первом вызове значениячитаются и хранятся в локальном массиве (в стеке).Вторая вызываемая функция имеет похожий (если не идентичный) кадр стека, поэтому кадр, объявленный и созданный во втором вызове, случайно перекрывается с предыдущим почти случайно на 100%.Вторая функция, похоже, поддерживает большую часть значений, но это просто удача (или неудача ...).Если бы между двумя вызовами были другие вызовы других функций, стек стал бы более поврежденным (ну, перезаписанным) и эффект работы только частично уменьшился бы.
Тип ошибки вOP-программа неприятна, потому что стек «к счастью» поддерживает часть значений, но «к несчастью» этот факт скрывает реальную проблему: локальные переменные исчезают после выхода из функции.