Salve a tutti, sono alle prime armi col linguaggio C e sto preparando alcuni progetti per l'università.
Il programma non va avanti ed eseguendo un debug ho riscontrato un errore di segmentazione al rigo 42, ho messo una freccetta nel codice per indicarvela.
Nel codice c'è anche scritta la traccia, non è svolta tutta poichè provavo le prime function e mi sono imbattuto in questo errore.

Spero che possiate aiutarmi, grazie anticipatamente.

codice:
/*Si vuole simulare l’archivio di chiamate di un gestore telefonico. L’archivio risulta  
mensile (31 giorni) . Ogni giorno vengono effettuate al massimo 10 chiamate e il  
costo al minuto di una chiamata è di 10 centesimi. Ogni chiamata è identificata dal  
numero chiamante, il numero ricevente, la durata della chiamata. Provvedere  
all’implementazione dell’algoritmo per la simulazione dell’archivio.  
Permettere, inoltre, all’utente di:  
• Dato un numero telefonico visualizzare tutte le chiamate con le relative  
informazioni in un singolo giorno  
• Dato un giorno e un numero telefonico visualizzare il costo totale delle  
chiamate (usare un algoritmo incrementale ricorsivo).  
L’archivio può anche essere inizializzato con informazioni casuali. Effettuare almeno  
due test per ognuna delle opzioni dell’utente.*/




#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define chiamate 10
#define giorni 30


char *numeri[]={"3341431454", "3462154556", "3911177368", "3338083794", "3398379801"};


typedef struct{ //Dichiarazione struct con io dati delle chiamate.
char *chiamante;
int ricevente;
int durata;
}Dati;


typedef struct{ //Dichiarazione struct contenente l'archivio mensile.
Dati *elenco[chiamate][giorni];
}Archivio;




Archivio creaDati(){ //Funzione per creare l'archivio, essa restituisce una struct di tipo Archivio.
    Archivio archivio;
    srand(time(NULL));
    int i=0, j=0, k=0;
    for (i=0; i<=giorni;){ //Ciclo for per riempire i campi Dati, una rand genera casualmente l'indice j dei numeri, 
                           //una rand genera casualmente numeri che ricevono la chiamata ed un'ultima genera la durata.
        for (k=0; k<chiamate; k++){
            j=rand()%5; 
 ---->        archivio.elenco[k][i]->chiamante = numeri[j];
            archivio.elenco[k][i]->ricevente = 1000000+rand()%999999+1;
            archivio.elenco[k][i]->durata = rand()%121;
        }
    }
    return archivio;
}


void stampaDati(Archivio archivio){ //Procedura per stampare l'archivio, prende come input una struct di tipo Archivio.
    int i=0, k=0;
    for (i=0; i<=giorni;){
        printf("\n\n\t\t----------[GIORNO %d]----------\n\n      CHIAMANTE\t\tRICEVENTE\t\tDURATA", i+1);
        for (k=0; k<chiamate; k++){
            printf("\n[C.%d] %s\t%d\t\t\t%d\tmin.", k+1, archivio.elenco[k][i]->chiamante, archivio.elenco[k][i]->ricevente, archivio.elenco[k][i]->durata);
        }
    printf("\n\n\t\tPremi invio per scorrere l'elenco.\n\t\t    Premi 'e' per ritornare.\n");
    getchar();
    if (getchar()=='e')
        break;
    else
            i++;
    }
}


void stampaElenco(){ //Procedura per stampare l'elenco dei numeri.
    int i=0;
    printf("I numeri presenti nel database sono i seguenti:\n");
    for (i=0; i<5; i++)
        printf("[N%d]  (+39)%s\n", i+1, numeri[i]);
    getchar();
}


void main(){
Archivio simula; //Dichiaro una variabile di tipo Archivio.
stampaElenco();  //Stampo l'elenco.
simula=creaDati(); //Creo i dati.
stampaDati(simula); //Stampo i dati.
return 0;
}