Errore segmentazione

di il
2 risposte

Errore segmentazione

Ciao a tutti, sto lavorando in C su Ubuntu e sto continuando a riscontrare un errore di segmentazione.
Praticamente ho un file binario dal quale devo estrarre dei dati e inserirli in una tabella hash.

Composizione file:

n° elementi
id 1° elemento
dimensione (del contenuto)
contenuto
id 2° elemento
dimensione (del contenuto)
contenuto
id 3° elemento
dimensione (del contenuto)
contenuto
...
id N° elemento
dimensione (del contenuto)
contenuto

Dati:

long numelem; // numero di elementi
long *id_elem; //contiene l'id dell'elemento

typedef struct {
	int dim; // dimensione del contenuto
	char* buffer; // contenuto
} elemento_t

Parte del codice:
     
	int i;
        elemento_t *elem;
        long *id_elem;
        fread(&numelem, sizeof(long), 1, filereg); // legge il numero di elementi
        
        for(i=0; i < numelem; i++) {
	    // allocazione memoria	
            elem=malloc(sizeof(elementi_t));
            id_elem=malloc(sizeof(long));
            
	    fread(&id_elem, sizeof(long), 1, filereg); // leggo l'id elemento
            fread(&elem->dim, sizeof(int), 1, filereg); // leggo la dimensione del contenuto
            
            // alloco memoria per il contenuto
            elem->buffer=malloc(elem->dim);
            fread(&elem->buffer, elem->dim, 1, filereg); // leggo il contenuto

            tab_hash_insert(tab_hash, id_elem, elem) == NULL) { // funzione di inserimento nella tab hash
                printf("Errore inserimento\n");
                free(elem->buffer); // libero memoria
                free(id_elem);
                free(elem);
                exit(EXIT_FAILURE);
            }
            
           free(elem->buffer);
           free(elem);
           free(id_elem);
        }
        fclose(filereg);  // chiusura file
    }

La tabella è stata correttamente inizializzata e la funzione tab_hash_insert funziona dato che è stata testata in altre punti del programma.

tab_hash_insert(tab_t *tab_hash, void* id, void *elem)
Ho provato a stampare i dati di ogni elemento, togliendo la funzione di inserimento, e lo fa correttamente. Con la funzione ottengo sempre l'errore di segmentazione.
Spero che qualcuno, dando uno sguardo al codice possa darmi una mano.Vi ringrazio anticipatamente, buona serata

2 Risposte

  • Re: Errore segmentazione

    Non so perché usi un puntatore per id_elem ma se lo fai devi scrivere

    fread(id_elem, sizeof(long), 1, filereg);

    e lo stesso per

    fread(elem->buffer, elem->dim, 1, filereg); // leggo il contenuto
  • Re: Errore segmentazione

    Buonasera Oregon, ho fatto come hai detto:
    fread(id_elem, sizeof(long), 1, filereg);
    fread(elem->buffer, elem->dim, 1, filereg);

    non compare più l'errore di segmentazione, ho fatto altri test e ho notato che funziona se elimino:
    
    free(elem->buffer);
    free(elem);
    free(id_elem);
    
    altrimenti i dati degli elementi (dim e buffer) sono uguali per ognuno. Oltre a queste modifiche ho sistemato la funzione che crea il file (tab hash -> file).


    Grazie per il tempo dedicato.

    PS: il puntatore per id_elem è dovuta all'implementazione della tabella hash utilizzata, non è stata una mia scelta.
Devi accedere o registrarti per scrivere nel forum
2 risposte