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.