2016-03-21 1 views
0

j'obtenir une erreur de segmentation, tout comparer membre de struct 0. La partie déroutante est que la comparaison ne se produisent plusieurs fois suivi d'un écrasement.Segmentation fault tandis que l'accès struct non null Membre-

aidez s'il vous plaît. code:

Dword addup(void) 
{ 
    Symbol *curr=NULL; 
    Dword ans=0; 
    plast->next=NULL; 

    if((phead==NULL) || (plast==NULL))/*checks that the global pointer to the head & tail is not null.*/ 
     return 0; 

    curr=phead; 

    printf("point 1 in addup()********\n"); 

    for(; curr!=NULL ; curr=curr->next) 
    { 

     if(curr!=NULL) 
     { 

      if( ((curr->feature.oper)==0) && ((curr->feature.ext)==0) )/*crash here !*/ 
      { 
       puts("point 2AA in addup()********"); 

       curr->adess=+IC; 
       ans++; 
      } 
      puts("point 2B in addup()********"); 
     } 

     if((curr->next)==NULL) 
      break; 
    } 


    if( (curr!=NULL) && (plast!=NULL)) 
    { 
     if(curr==plast)/*meaning all the list been searched.*/ 
      return ans; 
    } 


    return (-1); } 

Et le symbole:

typedef struct snode { 
    char label[MAXLABEL]; 

    Dword adess; 

    struct 
    { 
     unsigned int ext:1; 
     unsigned int oper:1; 
    }feature; 

    struct snode *next; 
}Symbol; 

Merci à tous ceux qui aide!.

** premier edit- PHEAD est un pointeur sur la tête de la liste. plast est un pointeur vers le dernier noeud (symbole) de la liste. initialisé dans une autre fonction. plast-> next est toujours null (c'est au début de la fonction - parce que je veux être sûr).

** deuxième edit- La fonction de création -

void csymbl(Dword addess, char *name, Dword ext, Dword ope){ 

tempnode.adess=addess;/*tempnode is a global Symbol,that been used to insert new nodes.*/ 

strcpy(tempnode.label,name); 

tempnode.feature.ext=ext; 

tempnode.feature.oper=ope; 

tempnode.next=NULL;} 

Et la fonction, qui se connectent à la liste:

void addsymbol(Symbol a){ 

if(phead==NULL)/*if phead point to NULL - meaning this is the first symbol been entered & up now the linked list was empty. */ 
{ 
    phead=&a; 
    plast=phead; 
} 
else if(plast==phead)/*If plast point to phead,than there is only one symbol in the list(up to now).*/ 
{ 
    plast=&a; 
    phead->next=plast; 
    plast->next=NULL; 
} 
else 
{ 
    plast->next=&a; 
    plast=plast->next; 
    plast->next=NULL; 
}} 
+7

Il n'est pas obligatoire que la valeur NULL soit invalide. –

+2

Qu'est-ce que 'plast'? Qu'est-ce que «phead»? Comment et où sont-ils initialisés? Pouvez-vous s'il vous plaît essayer de créer un [Exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) et nous montrer? –

+0

Comment puis-je vérifier cela? Pardon. – user3790620

Répondre

4

Votre fonction addsymbol ont un très problème sérieux, qui conduira à comportement non défini:

void addsymbol(Symbol a){ 
    if(phead==NULL)/*if phead point to NULL - meaning this is the first symbol been entered & up now the linked list was empty. */ 
    { 
     phead=&a; 
     plast=phead; 
    } 
    ... 
} 

Dans le code ci-dessus, si phead est NULL vous faire pointer vers la locale variables a.

Les variables locales sont appelées locale parce qu'ils sont locaux à l'intérieur de la fonction qu'ils sont définis dans, une fois la fonction renvoie les variables locales cessent d'exister. Une des variables locales vie est seulement pour le champ où il a été défini. Les arguments ne sont pas différents des autres variables locales.

Si vous stockez un pointeur sur une telle variable locale, le pointeur deviendra invalide et lorsque vous utiliserez le pointeur, vous aurez un comportement indéfini.

3

Vous n'initialisez pas next pour le premier élément

void addsymbol(Symbol a){ 

    if(phead==NULL)/*if phead point to NULL - meaning this is the first symbol been entered & up now the linked list was empty. */ 
    { 
     phead=&a; 
     plast=phead; 

     // unless set it can have any value 
     plast->next = NULL; 
    } 

.... 
} 

Ensuite, vous devez passer a comme un pointeur comme ceci:

void addsymbol(Symbol* a){ 

    if(phead==NULL)/*if phead point to NULL - meaning this is the first symbol been entered & up now the linked list was empty. */ 
    { 
     phead=a; // Note this changed - no & operator 

Comme nous l'avons mentionné dans les commentaires il y a un problème ici aussi:

Dword addup(void) 
{ 
    Symbol *curr=NULL; 
    Dword ans=0; 
    // plast->next=NULL; Don't do it here.... plast may be NULL 

    if((phead==NULL) || (plast==NULL))/*checks that the global pointer to the head & tail is not null.*/ 
     return 0; 

    plast->next=NULL; // If you really want that code, do it here 

Enfin, je me demande si vous voulez vraiment ceci:

  curr->adess=+IC; 

ou ce

  curr->adess+=IC;