Eccomi di nuovo, come suggerito da YuYevon ho modificato le funzioni in void e volevo chiedervi gentilmente se queste poche righe di codice sono scritte giuste:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Funzione per allocare memoria

void crea(int h, int l, int ***p)
{
int i;
*p = (int **) malloc ( h * sizeof(int *) );

for ( i = 0; i < h; i++ )
*(*p+i) = (int *) malloc( l * sizeof(int) );
}

// Funzione per liberare memoria

void libera(int h, int ***p)
{
int i;

for ( i = 0; i < h; i++ ) {
free(*(*p+i));
*(*p+i) = NULL;
}

free(*p);

*p = NULL;
}

// Funzione per stampare soluzione

void soluzione(int l, int h, int **p){
int i, j;
for (i=0; i<h; i++){
for (j=0; j<l; j++){
printf("%d ", p[i][j]);
}
printf("\n");
}
}

int main(void){
int **p, l, h, i, j;

// Fase di acquisizione input

scanf("%d%d", &l, &h);

// Allocazione memoria per matrice

crea(h, l, &p);

// Riempimento matrice

for (i=0; i<h; i++){
for (j=0;j<l;j++){
scanf("%d", &p[i][j]);
}
}

// Stampa soluzione

printf("%d %d\n", l, h);
soluzione(l, h, &p);
libera(h, &p);

return 0;
}
Ve lo chiedo perchè non funziona come dovrebbe

Grazie!!!