2016-12-18 6 views
-2

Итак, я создал двусвязный общий список в C. Я успешно создал его с помощью ints в качестве хранимых данных, но теперь мне нужно сделать его общим.Сегментация Неисправность при использовании memcpy с указателями void - C

Я создал тип списка и узел переменной:

struct node{ 

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

}; 

struct list{ 

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

}; 

меня возникли проблемы с установкой значения в элемент в узле. У меня есть следующий код для вставки newNode перед текущим указателем.

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); 

... 

Указатель Void p - это некоторые данные, а itemSize - количество байтов указанных данных. Конечно, это не весь код insertBefore, но логика в этом должна звучать, поскольку я создал список с int как тип элемента.

Когда я называю это, я получаю ошибку сегментации: 11 ошибок, и я не уверен, почему.

Любая помощь будет очень признательна!

редактировать:

Я включил некоторые из другого кода называется, поскольку это может быть там, где материал собирается обратно, хотя вина сегментный находится на memcpy в 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; 
} 

, а затем этот называется в основном:

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

Почему просто не позволить пользователю список вашего беспокойства о выделения и освобождения их данные? Охлаждение их использованием 'malloc' для хранения данных строго ограничивает. Просто требуйте действительный указатель данных при вставке в список, а также обратный вызов для освобождения данных при создании объекта списка. – StoryTeller

+0

Я пытаюсь создать библиотечный модуль, чтобы его можно было повторно использовать позже, когда пользователь не видит узлы или что-то еще, и только перемещается вперед и назад между данными по мере необходимости, сохраняя для них как можно более простой. –

+0

(Также я не создал идею для этого, мне только что сказали, что мне нужно это сделать, я полностью согласен с вами!) –

ответ

0

Ваш код пытается memcpy(new->item, 3, sizeof(int)) Вы получаете сегментацию потому что 3 не является адресом разыменования.

Вместо этого, вы должны сделать это:

int x = 3; 
insertBefore(l, &x); 
Смежные вопросы