2015-11-15 2 views
2

J'essaie d'implémenter la liste chaînée par moi-même. Donc quand j'ajoute de nouvelles données, j'utilise quelque chose comme node->data = datadata is (void*) type. Donc, je veux empêcher la corruption de données en modifiant accidentellement la variable ajoutée.Comment obtenir une copie des données du pointeur vide

Par exemple:

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

Comment puis-je faire cela? J'ai essayé de copier la façon suivante:

void* data_copy; 
*data_copy = *_data; 

Mais je sentais que cela ne fonctionnerait pas et il ne fonctionne pas.

+1

Etes-vous sûr de faire C? L'opérateur 'new' est C++. – alk

Répondre

2

Une façon simple de faire cela est d'exiger que l'appelant spécifie combien de temps les données qu'il vous donne sont. Modifier la signature de votre fonction LinkedList_add à ceci:

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

puis faire quelque chose comme ça, où size est la taille que vous avez reçu de l'appelant.

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

memcpy(copy, data, size); 

Dans un monde réel, je ne voudrais pas faire quelque chose comme ça. Au lieu de cela, je demanderais à l'appelant de copier les données que j'ai mises dans la liste chaînée. Si l'appelant ne veut pas que ses données soient accidentellement écrasées, il doit en faire lui-même une copie. S'il veut être en mesure d'écraser les données (ce qui est un cas d'utilisation courant) ou s'il ne se soucie pas si elles sont écrasées par accident, il ne voudra peut-être pas que les données soient copiées. N'essayez pas de mettre le programmeur sous tutelle, ce qui rapporte rarement en C.