给出以下类型
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
完整无缺?
答案 0 :(得分:5)
这个memcpy所有数据是否正确地分配给我的堆分配了heapNode?即,在此过程中没有任何损坏。 *数据完好无损?
这个问题的答案是memcpy
使用shallow copy
概念。在shallow copy
中,原始结构(节点)TSNode node = get_node();
中的指针将被逐位复制到新节点heapNode
(TSNode* heapNode
),也称为按比特复制。因此,您的新heapNode
指针也将指向与您使用TSNode node = get_node();
复制值的原始节点(memcpy
)指针相同的位置。因此,一旦控制从函数myFun
返回,您的原始节点将从内存中释放。因此,您的新节点指针将变为dangling pointers
。这是memcpy
的重要副作用。