我正在为我的项目使用通用链表。作为参考,我正在关注David Muto所做的实现。我的目标是从纯文本文件中解析用户信息(用户名和其他详细信息)并将其加载到我的链接列表中。
typedef struct {
char *user_name;
char *password;
char *friends;
}user_info;
这是代码流。
list users;
list_new(&users,sizeof(user_info*),free_users);
init_server(&users);
list_for_each(&users,iterate_users);
list_destroy(&users);
解析在init_server()
完成。在其中分配user_info结构并将对标记的引用复制到其中。在此之后,我打电话给list_append()
。
void list_append(list *list, void *element){
listNode *node = malloc(sizeof(listNode));
node->data = malloc(list->elementSize);
node->next=NULL;
memcpy(node->data,element,list->elementSize);
if(list->logicalLength == 0){
list->head = list->tail = node;
}else {
list->tail->next=node;
list->tail=node;
}
list->logicalLength++;
}
列表中的所有元素中仅存在用户名引用。这是价值观
元素(传递给list_append()
的结构引用)和调用返回后列表的头部。
(gdb) print *(user_info*)element
$31 = {username = 0x603270 "trudy", password =
0x603290"areyouthereyet",friends=0x6032b0 "bob;alice\n"}
(gdb) print *(user_info *)list->head->data
$36 = {username = 0x603270 "trudy", password = 0x0, friends = 0x0}
答案 0 :(得分:2)
此:
sizeof(user_info*)
应该是这样的:
sizeof(user_info)
你想要结构本身的大小,而不是指向它的指针的大小。现在,您的memcpy()
来电并未复制所有数据。
同样,出于同样的原因,listNode *node = malloc(sizeof(listNode))
应该是listNode *node = malloc(sizeof(*node))
。我假设node->data = malloc(list->elementSize);
在您将正确的尺寸传递给list_new()
后将是正确的。
答案 1 :(得分:1)
list-> elementSize设置为什么?
另一个潜在问题:
您正在存储指向字符串所在内存的指针。 假设你解析一个字符串然后存储一个指针。 稍后如果取消分配字符串,则指针将针对稍后放置的任何内容。调试非常困难。确保在使用列表期间保留字符串。