给定以下类型
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
的严重副作用。