如何获取void指针数据的副本

时间:2015-11-15 15:23:14

标签: c pointers copy void void-pointers

我尝试自己实现链表。因此,当我向其添加新数据时,我会使用node->data = data data is (void*) type之类的内容。所以我想通过不小心编辑添加的变量来防止数据损坏。

例如:

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

我该怎么做? 我试着用这种方式复制它:

 void* data_copy;
 *data_copy = *_data;

但是我觉得它不起作用,但事实并非如此。

1 个答案:

答案 0 :(得分:3)

执行此操作的一种简单方法是要求调用者指定他提供给您的数据的时长。将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中得到回报。