【问题标题】:node->pointer = pointer vs node->pointer using memcpynode->pointer = 指针 vs node->pointer 使用 memcpy
【发布时间】:2018-03-15 13:50:05
【问题描述】:

这是我的结构:

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;

谢谢。

【问题讨论】:

  • 可能是因为memcpy复制了所有数据,而赋值只复制了指针
  • 赋值不是必须的,node->content = memcpy(node->content, content, content_size);等价于memcpy(node->content, content, content_size);。现在您应该更清楚为什么memcpy 方式有效而node->content = content; 无效。
  • 顺便说一下,如果您使用例如分配内存malloc 并让node->content 指向该内存,您将与node->content = content 发生内存泄漏,因为您丢失了原始指针。

标签: c pointers memory linked-list dynamic-memory-allocation


【解决方案1】:

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

node->content = content 不会复制任何数据。您所做的只是将node->content 设置为content 中的内存地址。

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

要确保您的node 拥有content 的私人副本(您传入listnew()),您必须使用memcpy()。然后您的程序的其余部分可以更改/释放原始的content 而不会影响node->content

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

【讨论】:

    【解决方案2】:

    任务:

    node->content = content;
    

    只是让指针node->content 指向指针content 的位置,而不复制任何内容。

    然而,

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

    实际上复制指针content指向的地方的内容,指向node->content指向的地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多