给定以下类型
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
是否完好无损?
最佳答案
Does this memcpy all data correctly to my heap allocated heapNode? i.e. nothing is corrupted in the process & the *data is intact?
这个问题的答案是,memcpy
使用了shallow copy
的概念。在浅拷贝
中,你原来结构(节点)TSNode node = get_node();
中的指针会被拷贝到新节点heapNode
(TSNode* heapNode
) bit by bit 也叫bit wise copy。因此,您的新 heapNode
指针也将指向与您使用 复制值的原始节点的 (
。因此,一旦控制从函数 TSNode node = get_node();
) 指针相同的位置内存体myFun
返回,您的原始节点将从内存中释放。因此,您的新节点指针将变为悬挂指针
。这是 memcpy
的一个重要副作用。
关于c 使用指针从堆栈复制结构到堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49322955/