3

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

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 起作用的行中复制了什么(行 //** - 指针或内容?它与要复制的数据存储在调用函数 (line //*)? 2) 通用链表的节点定义为: void *data; 那么为什么当我使用比较方法时,我必须将其转换为(char * )str1 .... 如果我以另一种方式复制字符串,转换会有所不同吗?提前感谢分配(!!),伙计。

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

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

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

4

1 回答 1

1

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

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

3)如果您的链表函数应该是通用的,那么第一个实现会更好。否则,您的函数将仅适用于字符串。

于 2013-10-12T20:01:16.793 回答