这是我的结构:
typedef struct s_list
{
void *content;
size_t content_size;
struct s_list *next;
} t_list;
我正在尝试创建一个函数来创建一个新节点:
t_list *lstnew(void const *content, size_t content_size);
我的问题是为什么以下结果不同:
为什么以下代码完美无缺:
node->content = memcpy(node->content, content, content_size);
如果以下情况不符合:
node->content = content;
感谢。
答案 0 :(得分:1)
作业:
node->content = content;
只是使指针node->content
指向指针content
所在的相同位置,而不复制任何内容。
然而,
memcpy(node->content, content, content_size);
实际上 复制 指针content
指向指针node->content
指向的位置的内容。
答案 1 :(得分:1)
content
仅包含数据存储在内存中的地址。
使用node->content = content
,您无法复制任何数据。您所做的只是将node->content
设置为content
中的内存地址。
之后node->content
和content
都指向相同的内存/数据。如果更改或甚至释放了该内存,则node
也将指向更改或释放内存。
为确保您的node
拥有content
的私人副本(您在listnew()
中传递),您必须使用memcpy()
。然后,您的程序的其余部分可以更改/释放原始content
,而不会影响node->content
。
编辑:我认为您在使用node->content
之前必须首先分配内存并将其地址分配给memcpy()
。