将结构传递给通用链接列表

时间:2013-10-18 19:18:17

标签: c linked-list

我正在为我的项目使用通用链表。作为参考,我正在关注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()

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}

2 个答案:

答案 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设置为什么?

另一个潜在问题:

您正在存储指向字符串所在内存的指针。 假设你解析一个字符串然后存储一个指针。 稍后如果取消分配字符串,则指针将针对稍后放置的任何内容。调试非常困难。确保在使用列表期间保留字符串。