Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C] puntatore a vettore

    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?
    codice:
    struct mail *elenco;
    funzione(&elenco);
    e poi come devo accedere ad elenco ed ai suoi membri all'interno della funzione?

    grazie a tutti

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Il prototipo è questo:
    codice:
    int funzione (struct mail **elenco, int *num);
    Per cui la funzione la chiami così:
    codice:
    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.

  3. #3
    ecco la funzione in oggetto:

    codice:
    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:
    codice:
    		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
    codice:
    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.

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Un motivo per fare il cast del risultato della malloc è proprio questo:

    codice:
    l = malloc(sizeof(vettore));
    memcpy(l, vettore, sizeof(vettore));
    Prova a farlo così:

    codice:
    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:

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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.