Salve di nuovo ragazzi, questa volta ho un bel grattacapo con l'allocazione dinamica all'interno di una funzione.
Ho bisogno di allocare dinamicamente ed inizializzare (leggendo da file) un vettore di strutture di dati anagrafici; ogni struttura contiene i campi nome, cognome, giorno di nascita, mese e anno. Qui di seguito posto i codici di due funzioni in teoria equivalenti ma delle quali solo la seconda funziona.
codice:
#define SLEN 31
typedef struct persona
{
char name[SLEN];
char surname[SLEN];
int day, month, year;
} PERSONA;
void read_file_1 (char* filename, PERSONA** list, int* dim)
{
FILE *input = NULL;
int i;
if ((input=fopen(filename,"r"))==NULL)
{
printf("errore apertura file\n");
return;
}
fscanf(input,"%d",dim);
*list = (PERSONA*)malloc(*dim*sizeof(PERSONA));
if (*list == NULL)
{
printf("errore allocazione memoria\n");
return;
}
for (i=0; i<*dim; i++)
{
fscanf(input,"%s",list[i]->name);
fscanf(input,"%s",list[i]->surname);
fscanf(input,"%d",&(list[i]->day));
fscanf(input,"%d",&(list[i]->month));
fscanf(input,"%d",&(list[i]->year));
}
fclose(input);
return;
}
PERSONA* read_file_2 (char* filename, int* dim)
{
PERSONA* list = NULL;
FILE *input = NULL;
int i;
if ((input=fopen(filename,"r"))==NULL)
{
printf("errore apertura file\n");
return NULL;
}
fscanf(input,"%d",dim);
list = (PERSONA*)malloc(*dim*sizeof(PERSONA));
if (list == NULL)
return NULL;
for (i=0; i<*dim; i++)
{
fscanf(input,"%s",list[i].name);
fscanf(input,"%s",list[i].surname);
fscanf(input,"%d",&(list[i].day));
fscanf(input,"%d",&(list[i].month));
fscanf(input,"%d",&(list[i].year));
}
fclose(input);
return list;
}
Come già detto, la seconda funzione, che ritorna un puntatore che a sua volta assegno a un altro puntatore nel main, funziona perfettamente. Per quanto riguarda la prima, invece, ottengo un segmentation fault alla seconda iterazione del ciclo marcato in rosso. Eseguendo il debug mi pare di capire che sia stata allocata solo una struttura, e non capisco il motivo. In più, anche mettendo quel codice nel main tutto sembra funzionare a meraviglia. Qualche idea?