2016-12-18 3 views
-2

J'ai donc créé une liste générique doublement liée en C. J'ai réussi à la créer avec ints comme données stockées mais maintenant je dois la rendre générique.Erreur de segmentation lors de l'utilisation de memcpy avec des pointeurs vides - C

J'ai créé un type de variable de liste et le noeud:

struct node{ 

    struct node *prev; 
    struct node *next; 
    void *item; 

}; 

struct list{ 

    struct node *first; 
    struct node *current; 
    struct node *last; 
    int itemSize; 

}; 

J'ai des problèmes avec l'insertion de valeurs dans élément dans le nœud. J'ai le code suivant pour insérer un newNode avant le pointeur en cours.

void insertBefore(list *l, void *p){ 

    struct node *new = (struct node*) malloc(sizeof(struct node)); 
    new->item = malloc(l->itemSize); 

    memcpy(new->item,p,l->itemSize); 

... 

Pointeur vide p est une donnée et itemSize est le nombre d'octets de ces données. Bien sûr, ce n'est pas tout le code insertBefore, mais la logique dans cela devrait être solide car j'ai fait en sorte que la liste fonctionne avec int comme type d'élément. Lorsque j'appelle cela, j'obtiens une erreur de segmentation: erreur 11 et je ne sais pas pourquoi.

Toute aide serait grandement appréciée!

modifier:

J'ai inclus une partie de l'autre code appelé qui pourrait être là où des choses va revenir, même si la faute de seg est au memcpy dans insertBefore

list *newList(int b){ 

    list *l = (list*)malloc(sizeof(list)); 
    l->itemSize = b; 
    l->first = NULL; 
    l->current = NULL; 
    l->last = NULL; 

    return l; 
} 

et ce est appelé dans la principale:

list *l = newList(sizeof(int)); 
insertBefore(l, (void *)3); 
... 
+0

Pourquoi ne pas simplement laisser l'utilisateur de votre souci de liste sur l'allocation et désallocation leurs données? Les empocher dans l'utilisation de 'malloc' pour stocker des données est très limitant. Exigez simplement un pointeur de données valide lorsque vous insérez dans la liste, ainsi qu'un rappel pour libérer les données lors de la création de l'objet liste. – StoryTeller

+0

J'essaye de créer un module de bibliothèque afin qu'il puisse être réutilisé plus tard où l'utilisateur ne voit pas de noeuds ou quoi que ce soit et ne fait que reculer et avancer entre les données comme il le souhaite, le plus simple possible. –

+0

(Aussi, je n'ai pas créé l'idée pour cela, je viens de me dire que je dois le faire, je suis entièrement d'accord avec vous!) –

Répondre

0

Votre code tente de memcpy(new->item, 3, sizeof(int)) Vous obtenez la segmentation faute parce que 3 n'est pas une adresse capable de déréférencement.

Au lieu de cela, vous devriez faire ceci:

int x = 3; 
insertBefore(l, &x);