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;
}