[C] Segmentation fault

franzu1
ciao stavo facendo un programma che controlla se un'espressione di parentesi è corretta o meno.
#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
apatriarca
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.

vict85
Potresti spiegare a parole esattamente cose intendi per espressione di parentesi e quando è corretta. Renderebbe la lettura del codice più facile.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.