我有一个程序来处理通用链表。在一种情况下,我用它来保存字符串。在我将新节点添加到列表中的函数中,我执行以下操作(以及其他内容..):
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); //**
它也有效 - 两种不同的方式有区别吗?如果是这样 - 什么更好?