c复制带有从堆栈到堆的指针的结构

时间:2018-03-16 14:19:51

标签: c heap-memory

给出以下类型

typedef struct {
  const void *data;
  uint32_t offset[2];
} TSNode;

我有一个包含一个分配的功能:

TSNode* myFun() {
    TSNode node = get_node();
    // rest of code
}

由于node在堆栈内存中被分配,所以一旦函数结束它就会消失。我想在以后的点跟踪该节点,所以我想把它复制到堆中。

TSNode* myFun() {
    TSNode node = get_node();

    TSNode* heapNode = malloc(sizeof(TSNode));
    memcpy(heapNode, &node, sizeof(TSNode));
    return heapNode;
}

这会将所有数据正确地存储到我的堆中heapNode吗? 即,在此过程中没有任何损坏。 *data完整无缺?

1 个答案:

答案 0 :(得分:5)

  

这个memcpy所有数据是否正确地分配给我的堆分配了heapNode?即,在此过程中没有任何损坏。 *数据完好无损?

这个问题的答案是memcpy使用shallow copy概念。在shallow copy中,原始结构(节点)TSNode node = get_node();中的指针将被逐位复制到新节点heapNodeTSNode* heapNode),也称为按比特复制。因此,您的新heapNode指针也将指向与您使用TSNode node = get_node();复制值的原始节点(memcpy)指针相同的位置。因此,一旦控制从函数myFun返回,您的原始节点将从内存中释放。因此,您的新节点指针将变为dangling pointers。这是memcpy的重要副作用。