Ho letto il tuo codice e credo di aver capito l'idea di fondo che volevi utilizzare, ma purtroppo ci sono alcuni errori logici, e altri presumo di distrazione, che ne minano il corretto funzionamento. Ti posto di seguito una versione corretta (o almeno così mi pare) del tuo codice:
#include<stdio.h>
#define N 5
int main()
{
int m[N][N];
for(int i = 0; i < N; ++i)
{
for(int j = 0; j < N; ++j)
{
m[i][j] = i * N + j + 1;
}
}
for(int i = 0; i < N; ++i)
{
for(int j = 0; j < N; printf("%2d ", m[i][j++]));
printf("\n");
}
printf("\n");
for(int U = 0, D = N - 1, L = -1, R = N - 1; D >= U && R >= L;)
{
for(int k = ++L; k <= R; printf("%d ", m[U][k++]));
for(int k = ++U; k <= D; printf("%d ", m[k++][R]));
for(int k = --R; k >= L; printf("%d ", m[D][k--]));
for(int k = --D; k >= U; printf("%d ", m[k--][L]));
}
printf("\n");
return 0;
}
Non so di preciso quale sia il tuo livello, ma se confrontando i codici non riesci a renderti conto in modo autonomo dei vari errori, chiedi pure.
P.S.
Ho rinominato le variabili “p”, “n”, “m”, “l” rispettivamente con “R”, “D”, “L”, “U”, che stanno per Right, Down, Left, Up.