PDA

Visualizza la versione completa : [C] Problema con puntatori nell'uso di struct


Dimitree88
05-02-2012, 19:27
ciao a tutti ho un problema che non riesco a risolvere da ore e ore :dhò:
e più ci provo più la stanchezza mi impedisce di capire..
Ho queste 2 struct


struct mail {
char mittente[LENGTH];
int size;
void *buf;
};

struct utente {
char username[LENGTH];
mail *lista_mail;
};


e un array di utente


struct utente * lita_utenti;

definite globalmente.

nel main, "compongo una mail" facendo:


struct mail nuova;
char messaggio[100] = {"prova messaggio"};
nuova.size = 100;
strcpy(nuova.mittente, "sono il mittente");
nuova.buf = (void *)messaggio;


se faccio


printf("%s", (char *)nuova.buf);

il messaggio si visualizza bene.

Poi alloco spazio necessario per aggiungere un utente alla "lista_utenti".
Aggiungo quindi un nuovo utente a questa lista.
Poi alloco spazio necessario per aggiungere una mail alla "lista_mail" dell'utente.
Aggiungo quindi la nuova mail, tramite:


lista_utente[0].lista_mail[0] = nuova;


di nuovo, facendo


printf("%s", (char *)lista_utente[0].lista_mail[0].buf);

il messaggio si visualizza bene.

fin qui tutto ok, poi però, se chiamo una funzione da me definita all'interno dello stesso sorgente:

print_mail();

che è in questo modo:


int print_mail () {
printf("mittente: %s\n", lista_utenti[0].lista_mail[0].mittente);
printf("mittente: %s\n", (char *) lista_utenti[0].lista_mail[0].buf);
return 0;
}

il mittente si visualizza bene, mentre il "corpo" della mail ha caratteri sballati tipo ?? e dimensione errata.
non riesco a capire proprio dove sbaglio.

oregon
05-02-2012, 20:35
Ci mostri tutto il codice intero in modo da poterlo copiare-incollare ed esaminare senza dover fare un collage?

Dimitree88
05-02-2012, 20:36
non è nient'altro che questo ma disseminato di commenti e bozze dei pezzi che dovrò implementare, che comunque non vanno a toccare le variabili in discussione

oregon
05-02-2012, 20:38
Se ti ho chiesto di postare il codice completo di main ci sarà un motivo ... puoi farlo in modo che ti possa rispondere o no?

Ad esempio, dove hai inserito il codice per l'allocazione di

lista_utente

?

ramy89
05-02-2012, 20:39
Non mi è chiaro dove scrivi queste porzioni di codice che hai postato, faresti meglio a postare il codice intero perchè ad esempio qua:



struct mail nuova;
char messaggio[100] = {"prova messaggio"};
nuova.size = 100;
strcpy(nuova.mittente, "sono il mittente");
nuova.buf = (void *)messaggio;


La cosa dipende molto da che ci fai con l' array messaggio, perchè tu fai puntare nuova.buf alla stringa,ma se la stringa viene sovrascritta nuova.buf non punta più alla stessa stringa.In memoria punta alla stessa area di memoria, ma se in quella memoria ci sono scritti caratteri differenti vengono letti caratteri differenti.

Dimitree88
05-02-2012, 20:39
si si certo, lo faccio senz'altro
devo solo pulirlo visto che sono centinaia e centinaia di righe di commenti di spezzoni da aggiungere

Loading