PDA

Visualizza la versione completa : [C] puntatore a vettore


Dimitree88
12-04-2012, 17:40
salve

mi si richiede di creare una funzione con prototipo:

int funzione (struct mail **elenco, int *num);

che deve:
1) riempire il vettore "elenco" che gli viene passato,
2) allocare questo vettore, e riempirlo di elementi "mail",
3) ritornare il numero di elementi, tramite il puntatore a "num".

inoltre nella funzione chiamante, devo:
4) iterare sul vettore per stampare gli elementi che lo compongono.

aggiungo inoltre che non posso aggiungere alla struct "mail" dei puntatori al prossimo o precedente elemento, ogni "mail" è quindi scollegata dall'altra

il punto (3) è stato facile, gli invece non mi sono chiari:
ottengo continui segfault non appena tento di accedere o allocare elementi di "elenco", molto probabilmente perchè non uso la sintassi corretta.

in dettaglio vorrei capire come devo dichiarare il vettore e poi passarlo alla funzione.
questo è giusto?


struct mail *elenco;
funzione(&elenco);


e poi come devo accedere ad elenco ed ai suoi membri all'interno della funzione?

grazie a tutti

Who am I
12-04-2012, 19:30
Il prototipo è questo:


int funzione (struct mail **elenco, int *num);


Per cui la funzione la chiami così:


struct mail* elenco;
int n;
funzione (&elenco,&n);


Però mancano due cose:
1)Fai vedere come è fatta la struttura elenco;
2)Posta il codice che hai scritto così possiamo capire il motivo del segmentation fault.

Dimitree88
12-04-2012, 20:40
ecco la funzione in oggetto:




int list(struct mail **l, int *num_msg) {

int n_msg;
read(f_from, &n_msg, sizeof(int));
*num_msg = n_msg;

if (n_msg <= 0) {
return 0;
}

struct mail vettore[n_msg];
int i;
for (i=0; i<n_msg; i++) {
vettore[i].sender = malloc(sizeof(char)*LENGTH);
vettore[i].recipient = malloc(sizeof(char)*LENGTH);
vettore[i].obj = malloc(sizeof(char)*LENGTH);
vettore[i].date = malloc(sizeof(char)*LENGTH);

read(f_from, vettore[i].sender, sizeof(char)*LENGTH);
read(f_from, vettore[i].recipient, sizeof(char)*LENGTH);
read(f_from, vettore[i].obj, sizeof(char)*LENGTH);
read(f_from, vettore[i].date, sizeof(char)*LENGTH);
read(f_from, &vettore[i].flags, sizeof(char));
read(f_from, &vettore[i].size, sizeof(int));

/* se stampo qui i campi di vettore[i] è perfetto */

l = malloc(sizeof(vettore));
memcpy(l, vettore, sizeof(vettore));

fifo_unlock();
return 0;
}




funzione chiamante:



struct mmbox_mail **l;
int num_msg;
list(l, &num_msg);
if (num_msg == 0) {
printf("nessuna mail\n");
}
else {
int i = 0;
for (i=0; i<num_msg; i++) {
printf("Mail %d di %d:\n", i+1, num_msg);
printf("Mittente : %s\n", l[i]->sender);
printf("Destinatario: %s\n", l[i]->recipient);
printf("Oggetto : %s\n", l[i]->obj);
printf("Ora : %s\n\n", l[i]->date);
printf("Size : %d\n", l[i]->size);
printf("Flags : %c\n\n", l[i]->flags);
}
}




ed ecco la struct



struct mail {
char *sender, *recipient;
char *obj, *date;
char flags;
size_t size;
};



ps. "f_from" usato nelle read è un filedescriptor aperto in un altra funzione, nessun problema nell'uso delle read..

il segfault lo ottengo nella funzione chiamante, appena tento di stampare qualcosa.
se stampo dentro la funzione invece, stampando i membri di "vettore" (dichiarato staticamente) invece di "l", tutto ok.

Who am I
13-04-2012, 16:32
Un motivo per fare il cast del risultato della malloc è proprio questo:



l = malloc(sizeof(vettore));
memcpy(l, vettore, sizeof(vettore));


Prova a farlo così:



l =(struct mail*) malloc(sizeof(vettore));


E vedi che errore ti da.Il problema è che l non è un puntatore a struct mail, ma un puntatore a puntatore a struct mail.
Hai fatto bene a passare un doppio puntatore perché se passavi un puntatore a struct mail, il risultato dell' assegnamento l=malloc(...) veniva scritto solo sulla variabile di copia locale alla funzione.
Puoi risolvere deferenziando l:



*l = malloc(sizeof(vettore));
memcpy(*l, vettore, sizeof(vettore));

Loading