Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [C]linux gcc: sapere in che riga avviene il segmentation fault

    Sto provando a implementare un dizionario.
    Questo è il main:
    codice:
    #include "prova.h"
    
    
    int main(int argc, char **argv)
    {
        dizionario d=creaDizionario();
        aggiungiChiave(d,"a");
        aggiungiChiave(d,"b");
        return 0;
    }
    Questo dizionario.c:
    codice:
    #include "prova.h"
    
    
    dizionario creaDizionario(void)
    {
        dizionario d=(struct __dizionario*)malloc(sizeof(struct __dizionario));
        d->vettore=(chiave*)malloc(MAXLUNG*sizeof(chiave));
        d->ultimo=-1;
        return d;
    }
    
    void scambiaChiavi(chiave a, chiave b)
    {
        char *t1,*t2;
        t1=(char*)malloc(strlen(a)*sizeof(char));
        t2=(char*)malloc(strlen(b)*sizeof(char));
        strcpy(t1,a);
        strcpy(t2,b);
        free(a);
        free(b);
        a=t2;
        b=t1;
    }
    
    void copiaChiave(chiave a, chiave b)
    {
        char *temp;
        temp=(char*)malloc(strlen(b)*sizeof(char));
        free(a);
        strcpy(temp,b);
        a=temp;
    }
    
    void aggiungiChiave(dizionario d, chiave elem)
    {
        int i;
        bool out=false,error=false;
        for(i=0; i<= d->ultimo && !out && !error; i++)
        {
            if(strcmp(d->vettore[i],elem)>0)
                out=true;
            else if(strcmp(d->vettore[i],elem)==0)
                error=true;
        }
        if(!error)
        {
            d->ultimo++;
            for(int j=i+1 ;j<=d->ultimo;j++)
                copiaChiave(d->vettore[j],d->vettore[j-1]);
            copiaChiave(d->vettore[i],elem);
        }
        else
            fprintf(stderr,"La chiave non è stata aggiunta perchè era già presente\n");
    }
    
    void stampaDizionario(dizionario d)
    {
        printf("Elenco parole:\n");
        for(int i=0;i<=d->ultimo;i++)
            printf("%s\t",d->vettore[i]);
        printf("\n");
    }
    Questo dizionario.h :
    codice:
    #ifndef PROVA_H
    #define PROVA_H
    
    #include <stdio.h>
    #include <stdbool.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAXLUNG 1000
    
    
    typedef char *chiave;
    
    typedef struct __dizionario
    {
        chiave *vettore;
        int ultimo;
    }*dizionario;
    
    dizionario creaDizionario(void);
    void scambiaChiavi(chiave a, chiave b);
    void copiaChiave(chiave a, chiave b);
    void aggiungiChiave(dizionario d, chiave elem);
    void stampaDizionario(dizionario d);
    
    #endif
    Va in segmentation fault appena aggiungo la seconda chiave.
    Ma non so in che riga, penso comunque sia nella procedura aggiungiChiave o copiaChiave.
    Non so proprio dov'è l' errore
    E comunque come si fa con gcc a sapere qual'è la rigna in cui va in segmentation fault, io sto compilando con un makefile:
    codice:
    default:
    	gcc -std=c99 -Wall -o prova prova.c
    dizionario:
    	gcc -std=c99 -Wall -o prova prova.c dizionario.c
    clean:
    	rm prova 
    cleanall:
    	rm prova prova.o
    Ma quando lo eseguo mi dice solo "segmentation fault" da terminale, senza dire la riga.

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Era sbagliata la copiaChiave, a=temp era un assegnamento solo della variabile formale passata alla funzione, ho risolto usando una strcpy.

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.