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。关于存储指向字符串的指针:现在,我将在解析过程中获取的标记进行压缩,并在不需要时释放它们