我有一个处理通用链表的程序。在一种情况下,我用它来保持字符串。 在我将新节点添加到列表的函数中,我执行以下操作(以及其他内容..):
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); //**
它也有效 - 两种不同的方式有区别吗?如果是的话 - 什么更好?
答案 0 :(得分:1)
1)您正在复制元素中包含的数据,而不是指针。如果要复制指针,则需要将&amp; element作为第二个参数传递。
2)编译器不知道void指向的是什么,所以你需要强制转换为它的类型。
3)如果你的链表功能应该是通用的,那么第一个实现就更好了。否则,您的函数只适用于字符串。