PROBLEMA C: problema segmentation fault - malloc

Pubblicità

matteoc91

Utente Attivo
Messaggi
158
Reazioni
17
Punteggio
38
Salve a tutti, sono nuovo :)
Avrei un problema con un programma che devo scrivere; in sostanza è un esercizio di liste.
Lo scopo è quello di caricare una lista con determinate funzioni e procedure per svolgere qualche piccolo esercizio. In particolare si vuole restituire il primo elemento della lista. Le procedure di crea_lista, inserisci_in_testa ed inserisci_in_coda sono state testate e funzionano, ma quando tento di scrivere il codice per prima_della_lista il compilatore non segnala errori, ma in fase di eseguzione ottengo un segmentation fault.
Ho provato a semplificare il codice ed ho scoperto che l'errore era dovuto alla presenza o meno della malloc. Il problema è che la malloc dovrebbe essere corretta e credo ci sia qualche bug che non riesco a scovare.
Il programma è il seguente:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define N 25


typedef enum {FALSE,TRUE} bool;
typedef enum {ERROR,OK} status;


typedef struct _nodo *word_list;
struct _nodo{
char *parola;
word_list next;
};


word_list crea_lista(char *);
void stampa_lista(word_list l);
void inserisci_in_testa(word_list *l,char *);
void inserisci_in_coda(word_list *l,char *);
void prima_della_lista(word_list l);


main(){
word_list myList;
inserisci_in_testa(&myList,"Prova");
stampa_lista(myList);
inserisci_in_testa(&myList,"Prova_testa");
stampa_lista(myList);
inserisci_in_coda(&myList,"Prova_coda");
stampa_lista(myList);
char *s;
s=(char *)malloc(N*sizeof(char));
prima_della_lista(myList);
}


word_list crea_lista(char *parola){
if(strlen(parola)>=N){
printf("Wrong size of char\n");
return NULL;
}
word_list newList=(word_list)malloc(sizeof(struct _nodo));
newList->parola=(char *)malloc(N*sizeof(char));
strcpy(newList->parola,parola);
newList->next=NULL;
printf("New list created\n");
return newList;
}


void stampa_lista(word_list l){
word_list temp=l;
printf("LISTA:\n");
while(temp){
printf(" elements: %s\n",temp->parola);
temp=temp->next;
}
}


void inserisci_in_testa(word_list *l,char *parola){
if(!(*l)){
*l=crea_lista(parola);
return;
}
word_list temp=crea_lista(parola);
temp->next=*l;
*l=temp;
printf("Added\n");
}


void inserisci_in_coda(word_list *l,char *parola){
if(!(*l)) *l=crea_lista(parola);
else inserisci_in_coda(&((*l)->next),parola);
}


void prima_della_lista(word_list l){
word_list temp=l;
if(!temp) return;
printf("%s",temp->parola);
}

In sostanza quando lo compilo non mi da problemi, mentre quando lo faccio startare mi dice questo:
New list created
Added
LISTA:
elements: Prova
Segmentation fault

Ho provato a togliere dal main la malloc e tutto funziona e mi dà come output:
New list created
LISTA:
elements: Prova
New list created
Added
LISTA:
elements: Prova_testa
elements: Prova
New list created
LISTA:
elements: Prova_testa
elements: Prova
elements: Prova_coda
Prova_testa

Non è che qualcuno può gentilmente darmi una mano?
Grazie,
Matteo.
 
Codice:
printf("%s",temp->parola);
sei sicuro che sia giusto?
word_list non è passato come puntatore quindi '->' va sostituito con '.'
ma potrei sbagliarmi
 
Ciao, grazie della risposta :)

Purtroppo l'errore non è quello, ho provato, ma il compilatore segnala un errore.
Ho risolto modificando il metodo inserisci_in_testa, facendo tornare la lista come risultato dello stesso, ed il programma funziona, però non ho capito come mai nell'altro modo no :(
word_list inserisci_in_testa(word_list *l,char *parola){
if(!(*l)) return crea_lista(parola);
word_list temp=crea_lista(parola);
temp->next=*l;
printf("Added\n");
return temp;
}
Nella precedente versione ho provato a dare un free di temp, ma ovviamente mi cancella una parte dello heap e non mi risolve il problema.
 
Pubblicità
Pubblicità
Indietro
Top