Salve a tutti, riesco a ordinare un array monodimensionale ma non capisco proprio perchè non riesca a ordinare un array tridimensionale. Si blocca in fase di runtime e non capisco proprio il motivo

Vi posto il codice..
PS ho creato una funzione che mi inizializza i dati di input

codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#ifdef _WIN32
#include <windows.h>
#define MAX_CIFRE 4 // numeri compresi tra 0 e 999
#define RADICE_SIZE 10
#define IS_FULL(ptr) (!ptr)
#define IS_EMPY(ptr) (!ptr)
#define MAX 5000
#define MAX_CIFRE 4 // numeri compresi tra 0 e 999
#define RADICE_SIZE 10
#define IS_FULL(ptr) (!ptr)
#define IS_EMPY(ptr) (!ptr)
#define ITERAZIONI 7
#define DIMENSIONE_MAX_LISTA 5000

typedef struct list_node *list_pointer;
typedef struct list_node {
int chiave[MAX_CIFRE];
list_pointer link;
}lista;

int dimensioni[]= {50,100,200,500,1000,2000,5000};

void creazione_dati (int testa[][ITERAZIONI][DIMENSIONE_MAX_LISTA]);
void scambia(int *x,int *y);
void sort_inserzione(int lista[][ITERAZIONI][DIMENSIONE_MAX_LISTA],int m,int n);



main(){
randomize();
printf("\nEsercitazione numero 23\n");
int i,j,k;

int testa[4][7][DIMENSIONE_MAX_LISTA];



//****************************************************************************
//****************************************************************************
//****************************************************************************
//*************************ORDINAMENTO PER SELEZIONE**************************
//****************************************************************************
//****************************************************************************
//****************************************************************************

creazione_dati (testa);

//### ARRAY ORDINATO #################################################*SELEZIONE

for(i=0;i<50;i++)printf("testa[0][0][i]");
for(i=0;i<4;i++)
for(j=0;j<7;j++)


sort_inserzione(testa,i,j);



for(i=0;i<50;i++)printf("testa[0][0][i]");

}

void sort_inserzione(int lista[][ITERAZIONI][DIMENSIONE_MAX_LISTA],int m,int n)
{
int i,j;
int prossimo;
n = dimensioni[n];
for(i=1;i<n;i++)
{
prossimo=lista[m][n][i];
for(j=i-1;j>=0 && prossimo<lista[m][n][j];j--)
lista[m][n][j+1] = lista[m][n][j];

lista[m][n][j+1] = prossimo;
}