Salve a tutti, come esercizio universitario dovrei creare in C un grafo con matrice di adiacenza (per il momento vuoto), stamparlo ed eliminarlo. Il problema è che il programma smette di funzionare durante l'allocazione della matrice, e non capisco perchè. Questo è il codice (è solo una bozza, so che è pieno di difetti ma mi serve solo per vedere se le funzioni sono corrette):

codice:
#include<stdio.h>
#include<stdlib.h>

struct dirgraph_s {
    int** adj; //Matrice di adiacenza.
    int n; //Numero di nodi del grafo.
};
typedef struct dirgraph_s* dirgraph_t;

dirgraph_t dirgraph_create(int n) {

    int i;

    dirgraph_t graph;
    graph->adj = (int**)malloc(n*sizeof(int *)); //allocazione array di puntatori a righe

    for(i=0; i<n; i++) //allocazione riga per ogni puntatore dell'array
        graph->adj[i] = (int *)malloc(n*sizeof(int));

    return graph;
}

int dirgraph_destroy(dirgraph_t graph) {

    if(graph->adj != NULL)
    {
        free(graph);
        return 1;
    }
    else if(graph->adj == NULL)
        return -1;
    else
        return 0;
}

int main()
{
    dirgraph_t graph;
    int i, n;

    printf("Scegliere cosa fare:\n0 - Eliminare il grafo e chiudere il programma.\n1 - Creare il grafo.\n2 - Stampare il grafo.\n");
    scanf("%d", &i);

    if(i == 0)
    {
        int out = dirgraph_destroy(graph);

        if(out == 1)
            printf("Il grafo è stato cancellato correttamente.\n");
        else if(out == 0)
            printf("Il grafo è già vuoto.\n");
        else
            printf("Errore.\n");
    }
    else if(i==1)
    {
        printf("Inserire il numero di vertici presenti nel grafo:\t");
        scanf("%d", &n);
        graph = dirgraph_create(n);
    }
    else if(i==2)
    {
        int n1, n2;

        if(graph->adj != NULL)
        {
            for(n1=0; n1<n; n1++)
            {
                for(n2=0; n2<n; n2++)
                {
                    printf("%d\n", graph->adj[n1][n2]);
                }
            }
        }
        else
            printf("Errore: grafo non trovato.");
    }
    else
    {
        printf("Errore: comando non valido.\n");
        exit(1);
    }
}
Qualcuno saprebbe aiutarmi?