[C] Segmentation fault
ciao stavo facendo un programma che controlla se un'espressione di parentesi è corretta o meno.
il programma viene compilato con successo ma all'esecuzione mi da errore: segmentation fault. Mi pare che quest'errore ci sia quando si fa riferimento ad aree di memoria non allocate (ma nn sono sicuro...). nn riesco proprio a capire dove sia l'errore...qualcuno mi da una mano
?
#include <stdio.h> #include <stdlib.h> #include <math.h> struct parentesi { char tqg; struct parentesi* prox; }; void allunga(struct parentesi* inizio, char input) { struct parentesi* nuovo,*a; a=inizio; nuovo=(struct parentesi*)malloc(sizeof(struct parentesi)); if (nuovo==NULL) exit(EXIT_SUCCESS); inizio=nuovo; nuovo->prox=a; nuovo->tqg=input; } int main (int argc,char*argv[]) { int i,j,k; char input; struct parentesi *inizio,*tram,*bici; inizio=NULL; scanf("%c",&input); i=1; while (input!='=') { allunga(inizio,input); scanf("%c",&input); i=i+1; } tram=inizio; j=0; k=0; while (j!=i) { if (tram->tqg==')') { bici=tram; while (bici->tqg!='(') { if ((bici->tqg=='(')||(bici->tqg=='[')||(bici->tqg=='{')) k=k-1; if ((bici->tqg==']')||(bici->tqg=='}')) k=k+1; bici=bici->prox; } if (k!=0) { printf("%s\n","L'espressione inserita non è corretta"); exit(EXIT_SUCCESS); } } if (tram->tqg==']') { bici=tram; while (bici->tqg!='[') { if ((bici->tqg=='(')||(bici->tqg=='[')||(bici->tqg=='{')) k=k-1; if ((bici->tqg==')')||(bici->tqg=='}')) k=k+1; bici=bici->prox; } if (k!=0) { printf("%s\n","L'espressione inserita non è corretta"); exit(EXIT_SUCCESS); } } if (tram->tqg=='}') { bici=tram; while (bici->tqg!='{') { if ((bici->tqg=='(')||(bici->tqg=='[')||(bici->tqg=='{')) k=k-1; if ((bici->tqg==')')||(bici->tqg==']')) k=k+1; bici=bici->prox; } if (k!=0) { printf("%s\n","L'espressione inserita non è corretta"); exit(EXIT_SUCCESS); } } tram=tram->prox; if (tram==NULL) { printf("%s\n","L'espressione inserita non è corretta"); exit(EXIT_SUCCESS); } j=j+1; k=0; tram=inizio; while (k!=j) { tram=tram->prox; k=k+1; } k=0; } exit(EXIT_SUCCESS); }
il programma viene compilato con successo ma all'esecuzione mi da errore: segmentation fault. Mi pare che quest'errore ci sia quando si fa riferimento ad aree di memoria non allocate (ma nn sono sicuro...). nn riesco proprio a capire dove sia l'errore...qualcuno mi da una mano

Risposte
Siccome inizio è passato per valore, il valore contenuto nella variabile inizio non varia mai nel main e quindi tram sarà uguale a NULL quando tenti di accedere al suo valore. La soluzione consiste nel cambiare il tipo del parametro inizio nella funzione allunga in modo che sia un puntatore a puntatore e quindi passare inizio per riferimento. Ho provato a fare la modifica nel tuo codice e ha avuto successo nell'evitare il segmentation fault (ma non ho studiato abbastanza il tuo codice* per capire se l'output è corretto).
* Ho trovato l'errore usando un memory debugger.
* Ho trovato l'errore usando un memory debugger.
Potresti spiegare a parole esattamente cose intendi per espressione di parentesi e quando è corretta. Renderebbe la lettura del codice più facile.