使用memcpy复制指针(而不是它的内容)

时间:2013-10-12 19:26:21

标签: c memcpy void-pointers generic-list

我有一个处理通用链表的程序。在一种情况下,我用它来保持字符串。 在我将新节点添加到列表的函数中,我执行以下操作(以及其他内容..):

void list_append(list *list, void *element)
{

  // create the new node... 
  listNode *node = (listNode *)malloc(sizeof(listNode));
  node->data = malloc(list->elementSize); // NOTE : elementSize is set to be sizeof(char *)
  node->next = NULL;
  memcpy(node->data, element, list->elementSize);   //**

  // rest of the insertion operation....

现在,在调用list_append函数的函数中,执行以下操作:

 int numNames = 5;
 const char *names[] = { "David", "Kevin", "Michael", "Craig", "Jimi" }; //*

 int i;
 list list;
 list_new(&list, sizeof(char *), free_string ,compareString);

 char *name;
 for(i = 0; i < numNames; i++) {
 name = strdup(names[i]);
 list_append(&list, &name);  //****
 }

另外,我有一个“比较方法”来比较2个字符串:

int compareString(void *str1,void *str2)
{

return strcmp(*(char **)str1 ,*(char **)str2);
}

如果是这样,我几乎没有问题: 1)在memcpy运行的行中复制了什么(行// ** - 指针或内容? 是否与要复制的数据存储在调用函数中的方式有​​关(行// *)? 2)通用链表的节点定义为:void * data;那么为什么当我使用比较方法时,我必须将它转换为(char * )str1 ....如果我以另一种方式复制了字符串,那么转换是否会有所不同? 谢谢分配(!!),盖伊。

3)另一件事 - 如果我将memcpy执行的复制操作更改为:

memcpy(node->data, element, strlen((char *)element) + 1); //**

它也有效 - 两种不同的方式有区别吗?如果是的话 - 什么更好?

1 个答案:

答案 0 :(得分:1)

1)您正在复制元素中包含的数据,而不是指针。如果要复制指针,则需要将&amp; element作为第二个参数传递。

2)编译器不知道void指向的是什么,所以你需要强制转换为它的类型。

3)如果你的链表功能应该是通用的,那么第一个实现就更好了。否则,您的函数只适用于字符串。