Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214

    [C] Allocazione struttura, problemi!

    Ciao a tutti, in fase di esecuzione del mio programma, ricevo un errore di "segmentation fault", che presumo derivi dal fatto che non riesco ad allocare la memoria alla mia struttura. Posto un po di codice:

    Strutture:
    codice:
    typedef struct scheda {
      /** puntatore lista degli autori */
      autore_t* autore;         
      /** titolo */
      char titolo[LLSTRING +1];   
      /** note */
      char nota[LLSTRING+1];    
      /** collocazione nella biblioteca */
      char collocazione[LSSTRING+1];  
    } scheda_t;
    
    typedef struct autore {
      /** cognome/i (almeno uno deve essere presente) */
      char cognome[LCOGN +1];
      /** nome/i (almeno uno deve essere presente) */ 
      char nome [LNOME + 1];
      /** puntatore al prossimo autore */ 
      struct autore * next; 
    } autore_t;
    Dunque, quando inizializzo una nuova scheda, faccio semplicemente una:

    codice:
    scheda_t * res=(scheda_t*)calloc(1, sizeof(scheda_t)); 
     res->autore = NULL;  /*è un puntatore, va inizializzato a NULL*/
    Così, dovrei aver allocato lo spazio necessario per OGNI campo della struct, giusto? Probabilmente l'errore è qui, perchè quando uso questa scheda allocata sopra, mi da un segmentation fault...E' corretta l'allocazione? Grazie in anticipo!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Facci vedere in quale linea hai l'errore, oppure il codice che esegui ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    codice:
    void main()
    {scheda_t *res=NULL;
      res = new_scheda();
      if(res==NULL){printf("non allocata scheda\n");}
      else{printf("allocata! ora la libero...\n");
      		print_scheda(stdout, res); /*stampa la scheda vuota*/
      		free_scheda(&res); /*libera la scheda*/
      		if(res!=NULL){printf("non liberata\n");}
      		else{printf("liberata!\n");}
      	  }
      printf("fine\n");
    
    }
    
    void print_scheda (FILE* f, scheda_t * s)
    { 
    char *strcognome;
              strcognome=malloc(sizeof(strlen(s->autore->cognome)+1));
              strcognome=strncpy(strcognome, s->autore->cognome, sizeof(strlen(s->autore->cognome)+1) );
              strcognome=strcat(strcognome, STRING_NULL);
    }
    Alla malloc di strcognome c'è il segmentation fault...penso sia dovuto al fatto che non allochi la scheda, quindi non può recuperare la lunghezza di s->autore->cognome...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ma perché in

    char* *strcognome;

    due * ?

    E se pensi sia l'allocazione, perché non mostri la funzione

    new_scheda

    ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Perdonami, il puntatore in più è un errore di battitura, la funzione di nuova scheda è quella che ho scritto sopra, la calloc e il puntatore autore a null...dovrebbe essere solo questa! In fondo, la calloc mi inizializza già i campi...

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ma la funzione restituisce anche un valore ...

    Perché non la mostri tutta come richiesto?
    In questo modo fai solo perdere tempo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    codice:
    scheda_t * new_scheda (void)   
    {
     scheda_t * res=(scheda_t*)calloc(1, sizeof(scheda_t)); 
     res->autore = NULL; 
     if(res == NULL){return NULL;}
    else	
    return res; 
    }
    Non pensavo fosse significativo, scusami!

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Smoke666
    codice:
    scheda_t * new_scheda (void)   
    {
     scheda_t * res=(scheda_t*)calloc(1, sizeof(scheda_t)); 
     res->autore = NULL; 
     if(res == NULL){return NULL;}
    else	
    return res; 
    }
    Non pensavo fosse significativo, scusami!
    E' necessario avere tutto il quadro completo perché il problema potrebbe essere più di uno e in più parti del codice.

    Il tuo è sicuramente in

    strlen(s->autore->cognome)

    dato che autore è NULL.

    Molte parti del codice sono un po' "strane" ma non capisco proprio questa funzione

    print_scheda

    con il parametro FILE *f che non viene usato e in cui non si capisce cosa vorresti fare ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Il parametro FILE *f serve per stampare la scheda (che sia vuota o piena), su un file, o sullo stdout. Quel "malloc(sizeof(strlen(s->autore->cognome)))" mi serve per copiare la stringa...Potrei però aggiungere un if, nel caso la scheda sia vuota anzichè fare quello, alloco una stringa di un solo char contentente il terminatore, e stampo quella...Potrebbe funzionare?

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ma perché devi copiare la stringa? Non si capisce ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.