2017-10-04 75 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點的地方。