2015-11-15 3 views
2

Я пытаюсь реализовать связанный список самостоятельно. Поэтому, когда я добавляю новые данные, я использую что-то вроде node->data = data, где data is (void*) type. Поэтому я хочу предотвратить повреждение данных путем случайного редактирования добавленной переменной.Как получить копию данных указателя void

Например:

int data = 10; 
LinkedList_add(list, (void*)&data); 
... 
/* It will modify value in list */ 
data = new value; 

Как я могу это сделать? Я попытался скопировать это так:

void* data_copy; 
*data_copy = *_data; 

Но я чувствовал, что это не будет работать, и это не делает.

+1

Вы уверены, что C? Оператором 'new' является C++. – alk

ответ

2

Простым способом сделать это является требование, чтобы вызывающий абонент указывал, сколько времени ему передаются данные. Изменение подписи вашей LinkedList_add функции это:

void LinkedList_add(List*, size_t, const void*); 

, а затем сделать что-то вроде этого, где size размера вы получили от вызывающего абонента.

void *copy = malloc(size); 
if (copy == NULL) { 
    /* error handling here */ 
} 

memcpy(copy, data, size); 

В реальном мире я бы не стал заниматься чем-то подобным. Вместо этого я бы потребовал, чтобы вызывающий пользователь скопировал данные, которые я поместил в связанный список. Если вызывающий абонент не хочет, чтобы его данные были случайно перезаписаны, он должен сам сделать копию. Если он хочет перезаписать данные (что является обычным прецедентом), или если ему все равно, если он будет перезаписан случайно, он может не захотеть скопировать данные. Не пытайтесь поставить программиста под опеку, что редко окупается C. C.