给定以下类型

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;
}

这个memcpy是否将所有数据正确地分配给我分配的heapNode堆?
即在此过程中没有任何损坏,并且*data是完整的吗?

最佳答案

这是否正确将所有数据正确地分配给我的堆分配的heapNode?即在此过程中没有任何损坏和*数据完整吗?

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

08-05 06:53