2015-10-03 2 views
-1

Je continue d'obtenir cette erreur de segmentation: 11 et je ne sais pas pourquoi.Erreur de segmentation de liste chaînée C 11

Mon code:

typedef struct Node* NodePtr; 
struct Node 
{ 
    NodePtr next; 
    void *val; 
}; 

struct List 
{ 
    NodePtr head; 
}; 
typedef struct List* ListPtr; 

int compare(void *one, void *two) 
{ 
    if(*(int*)one < *(int*)two) 
     return -1; 
    else if(*(int*)one > *(int*)two) 
     return 1; 

    return 0; 
} 

ListPtr create() 
{ 
    ListPtr blah = malloc(sizeof(struct List)); 
    memset(blah, 0, sizeof(struct List)); 

    return blah; 
} 

NodePtr scan(NodePtr head, void *obj) 
{ 
    NodePtr previous, current; 

    previous = head; 
    current = head->next;  // Segmentation fault here!! 

    while(current != NULL && (compare(curry->val, obj) == -1)) 
    { 
     previous = current; 
     current = current->next; 
    } 

    return previous; 
} 

int insert(ListPtr llist, void *obj) 
{ 
    NodePtr newobj = malloc(sizeof(struct Node)); 
    NodePtr prevNode, nextNode; 

    prevNode = search(llist->head, obj); 
    nextNode = prevNode->next; 

    if((nextNode == NULL) || (compare(nextNode->val, obj) != 0)) 
    { 
     prevNode->next = newobj; 
     newobj->next = nextNode; 

     return 1; 
    } 
    else 
    { 
     free(newobj); 
    } 

    return 0; 
} 

Je pensais que head n'a pas été alloué, alors j'ai ajouté malloc à créer pour blah->head, mais toujours pas de chance.

Je pense que l'erreur est ici après un débogage: current = head->next.

Toute aide serait appréciée! Merci pour votre temps!

EDIT: Comment j'appelle insérer:

int main(int argc, char *argv[]) 
{ 
    ListPtr list = create(); 

    int x = 2; 
    int *p = &x; 

    while(*p != 0) 
    { 
     printf("\nEnter a number: "); 
     scanf("%d", p); 

     if(*p != 0) 
      insert(list, p); 
    } 

    return 0; 
} 
+1

Est-ce que 'head'' NULL' est présent lorsque l'instruction est exécutée? A-t-il été libéré? – Davislor

Répondre

1

Vous ne semblez pas vérifier si la liste est vide lorsque vous scannez. Cependant, sans un exemple minimum vérifiable complet qui nous dit comment vous avez appelé la fonction, il est impossible de dire avec certitude ce que vous avez fait.

Mise à jour

Maintenant que vous avez, qui semble l'être. Vous créez une liste vide et la recherchez dans votre fonction d'insertion. La fonction de recherche déréférence le pointeur zéro-out dans head, provoquant un segfault. Essayez ce qui suit: d'abord, vérifiez que votre pointeur est valide dans chacune de vos fonctions avant de faire quoi que ce soit avec. Une liste vide devrait échouer à chaque recherche. Deuxièmement, pour une portabilité maximale, vous souhaitez définir votre pointeur head sur NULL (car un pointeur NULL n'est pas forcément à zéro sur toutes les implémentations).

+0

Je vais ajouter comment je l'appelle dans l'OP. – neby