Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di rs9000
    Registrato dal
    Jun 2009
    Messaggi
    32

    [C] Inserire elemento in una lista

    Salve ragà,
    ho un problema nella funzione "inserisci" ottengo come output simboli senza senso anzichè la stringa che ho inserito, tuttavia se inserisco il contenuto della funzione direttamente nel main funziona perfettamente, quindi penso sia un problema nel passaggio della stringa come parametro della funzione... help please!

    codice:
    typedef struct NodoLista{
    	char *val;
    	struct entry *next;
    }t_lista;
    
    void inserisci(t_lista *testa, char *stringa);
    void stampa(t_lista *testa);
    
    int main(int argc, char *argv[]) {
    	t_lista s1,s2,s3,*testa;
    	
    	s1.val = "cane";
    	s2.val = "gatto";
    	s3.val =  "topo";
    	
    	s1.next = &s2;
    	s2.next = &s3;
    	s3.next = NULL ;
    	testa = &s1;
    	
    	char stringa[100];
    	printf("\nInserisci stringa: ");
    	scanf("%s", stringa);
    	
    	inserisci(testa,stringa);
    	stampa(testa);
    		
    	
    	return 0;
    }
    
    void inserisci(t_lista *testa, char *stringa){
    	t_lista NewNode,*indice;
    	
    	NewNode.val = stringa; 
    	NewNode.next = NULL;
    	
    	indice = testa;
    	
    	while(indice->next != NULL){
    		indice = indice->next;
    	}
    	
    	indice->next = &NewNode;
    	
    	
    	
    }
    
    void stampa(t_lista *testa){
    	
    	t_lista *indice;
    	indice = testa;
    	
    	while(indice != NULL){
    		printf("\n%s",indice->val);
    		indice = indice->next;
    	}
    	
    }

  2. #2
    Non puoi copiare un array di char così.

    Devi usare la funzione strcpy di string.h

  3. #3
    Utente di HTML.it L'avatar di rs9000
    Registrato dal
    Jun 2009
    Messaggi
    32
    Sicuramente come dici tu è più corretto, ma funziona anche senza usare strcpy, il problema era che dovevo allocare dei bytes prima di copiare la stringa

    codice:
    	NewNode.val =  malloc(sizeof(stringa));
    	NewNode.val = stringa;
         //	strcpy (NewNode.val,stringa); non necessaria

  4. #4
    Non è questione di "è più corretto", è questione che sono due cose completamente diverse.
    Nelle due righe
    codice:
    	NewNode.val =  malloc(sizeof(stringa));
    	NewNode.val = stringa;
    sei riuscito a piazzare diversi errori:
    1. sizeof(stringa) non ti restituisce la lunghezza della stringa, ma le dimensioni di un char *; dovresti usare strlen(stringa)+1 (il +1 è per il carattere terminatore); ergo, stai allocando sempre 4 byte (su un sistema a 32 bit) invece delle dimensioni necessarie;
    2. prima assegni a NewNode.val il puntatore restituito dalla malloc, quindi ci assegni il puntatore contenuto in stringa; il risultato è che (1) hai un memory leak (visto che così perdi il puntatore restituito dalla malloc) e (2) fai sì che val punti a stringa, e non ad una sua copia. Ovvero, se il chiamante usa lo stesso buffer (cambiandone via via il contenuto) per inizializzare tutti gli elementi della lista, tutti gli elementi finiranno con puntare alla stessa stringa.
    Nota che in tutto questo la chiamata a malloc risulta assolutamente inutile, visto che scarti immediatamente il puntatore che ti ha restituito.

    Come ti è stato detto, devi fare in maniera diversa:
    1. alloca con malloc memoria sufficiente per la nuova stringa (nello specifico, strlen(stringa)+1);
    2. copia la nuova stringa nella vecchia con strcpy.

    In ogni caso, ti consiglio vivamente di ripassare i capitoli su stringhe e puntatori del tuo libro di C.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di rs9000
    Registrato dal
    Jun 2009
    Messaggi
    32
    Adesso ho capito.
    Grazie per le dritte sicuramente rivedro' tutto cio' che riguarda stringhe e puntatori.

  6. #6
    Amaro C++, il gusto pieno dell'undefined behavior.

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.