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:
In sostanza quando lo compilo non mi da problemi, mentre quando lo faccio startare mi dice questo:
Ho provato a togliere dal main la malloc e tutto funziona e mi dà come output:
Non è che qualcuno può gentilmente darmi una mano?
Grazie,
Matteo.
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);
}
#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
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
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.