[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.