2017-10-04 73 views
2

节点 - >指针这是我的结构:节点 - >指针=指针VS使用的memcpy

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; 

感谢。

+8

可能是因为'memcpy'复制了所有的数据,而赋值只复制*指针*。 –

+3

这个分配是没有必要的,'node-> content = memcpy(node-> content,content,content_size);'相当于'memcpy(node-> content,content,content_size);'。现在应该更清楚为什么'memcpy'的方式工作,'node-> content = content'不起作用。 –

+1

顺便说一下,如果您使用例如'malloc'并且使'node-> content'指向那个内存,当你丢失原始指针时,你将有'node-> content = content'的内存泄漏。 –

回答

1

content只包含数据存储在内存中的地址。

With node->content = content您不复制任何数据。你所要做的就是将node->content设置为content的内存地址。

之后node->contentcontent都指向相同的存储器/数据。如果该内存被更改或释放,您的node将指向更改或释放的内存。

为了确保您的nodecontent的私有副本(即您在listnew()通过),则必须使用memcpy()。然后你的程序的其余部分可以更改/释放原始content而不影响node->content

编辑:我假设你知道你必须先分配内存并在使用memcpy()之前将其地址分配给node->content

1

分配:

node->content = content; 

只是使指针node->content点于同一地方的指针content做,没有任何复制。

然而,

memcpy(node->content, content, content_size); 

实际上副本地点的内容,其中指针content点到指针node->content点的地方。