C 将结构传递给通用链表

C 将结构传递给通用链表,c,linked-list,C,Linked List,我正在为我的项目使用一个通用的链表。为供参考,我正在跟踪由所做的此实现。我的目标是从纯文本文件中解析用户信息(用户名和其他详细信息),并将其加载到我的链接列表中 typedef struct { char *user_name; char *password; char *friends; }user_info; 下面是代码流 list users; list_new(&users,sizeof(user_info*),free_users); init_server(&use

我正在为我的项目使用一个通用的链表。为供参考,我正在跟踪由所做的此实现。我的目标是从纯文本文件中解析用户信息(用户名和其他详细信息),并将其加载到我的链接列表中

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()
中完成。在其中,用户信息结构被分配,对令牌的引用被复制到其中。在此之后,我调用
list\u append()

列表_append() 问题 列表中的所有元素中仅存在用户名引用。以下是价值观 元素(传递给
list\u 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}
这:

应该是这样的:

sizeof(user_info)
您需要的是结构本身的大小,而不是指向它的指针的大小。现在,您的
memcpy()
调用没有复制所有数据

类似地,出于相同的原因,
listNode*node=malloc(sizeof(listNode))
可能应该是
listNode*node=malloc(sizeof(*node))
。我假设
node->data=malloc(list->elementSize)list\u new()

后,code>将是正确的:

应该是这样的:

sizeof(user_info)
您需要的是结构本身的大小,而不是指向它的指针的大小。现在,您的
memcpy()
调用没有复制所有数据

类似地,出于相同的原因,
listNode*node=malloc(sizeof(listNode))
可能应该是
listNode*node=malloc(sizeof(*node))
。我假设
node->data=malloc(list->elementSize)list\u new()

后,code>将是正确的:

应该是这样的:

sizeof(user_info)
您需要的是结构本身的大小,而不是指向它的指针的大小。现在,您的
memcpy()
调用没有复制所有数据

类似地,出于相同的原因,
listNode*node=malloc(sizeof(listNode))
可能应该是
listNode*node=malloc(sizeof(*node))
。我假设
node->data=malloc(list->elementSize)list\u new()

后,code>将是正确的:

应该是这样的:

sizeof(user_info)
您需要的是结构本身的大小,而不是指向它的指针的大小。现在,您的
memcpy()
调用没有复制所有数据


类似地,出于相同的原因,
listNode*node=malloc(sizeof(listNode))
可能应该是
listNode*node=malloc(sizeof(*node))
。我假设
node->data=malloc(list->elementSize)list\u new()

列表->元素大小设置为什么

另一个潜在问题:

您正在存储指向字符串所在内存的指针。 假设您解析一个字符串,然后存储一个指针。
稍后,如果字符串被释放,指针将指向稍后放置在那里的任何对象。调试将非常困难。确保在使用列表期间字符串保持不变。

列表->元素大小设置为什么

另一个潜在问题:

您正在存储指向字符串所在内存的指针。 假设您解析一个字符串,然后存储一个指针。
稍后,如果字符串被释放,指针将指向稍后放置在那里的任何对象。调试将非常困难。确保在使用列表期间字符串保持不变。

列表->元素大小设置为什么

另一个潜在问题:

您正在存储指向字符串所在内存的指针。 假设您解析一个字符串,然后存储一个指针。
稍后,如果字符串被释放,指针将指向稍后放置在那里的任何对象。调试将非常困难。确保在使用列表期间字符串保持不变。

列表->元素大小设置为什么

另一个潜在问题:

您正在存储指向字符串所在内存的指针。 假设您解析一个字符串,然后存储一个指针。
稍后,如果字符串被释放,指针将指向稍后放置在那里的任何对象。调试将非常困难。确保在使用列表期间字符串保持不变。

是的,这就解决了问题。谢谢是的,这就解决了。谢谢是的,这就解决了。谢谢是的,这就解决了。谢谢我为列表设置了错误的elementSize。关于存储指向字符串的指针:现在,我将在解析过程中获取的标记进行strdup,并在不需要时释放它们。如果释放它们,然后尝试使用指针,它将指向释放的内存。它可能仍然包含字符串,也可能不包含。这取决于程序的另一部分是否分配了内存并重用了相同的区域。很高兴你把它修好了。我为列表设置了错误的elementSize。关于存储指向字符串的指针:现在,我将在解析过程中获取的标记进行strdup,并在不需要时释放它们。如果释放它们,然后尝试使用指针,它将指向释放的内存。它可能仍然包含字符串,也可能不包含。这取决于程序的另一部分是否分配了内存并重用了相同的区域。很高兴你把它修好了。我为列表设置了错误的elementSize。关于存储指向字符串的指针:现在,我将在解析过程中获取的标记进行strdup,并在不需要时释放它们。如果释放它们,然后尝试使用指针,它将指向释放的内存。它可能仍然包含字符串,也可能不包含。这取决于程序的另一部分是否分配了内存并重用了相同的区域。很高兴你把它修好了。我为列表设置了错误的elementSize。关于存储指向字符串的指针:现在,我将在解析过程中获取的标记进行压缩,并在不需要时释放它们