c将结构与指针从堆栈复制到堆
给定以下类型c将结构与指针从堆栈复制到堆,c,heap-memory,C,Heap Memory,给定以下类型 typedef struct { const void *data; uint32_t offset[2]; } TSNode; 我有一个包含赋值的函数: TSNode* myFun() { TSNode node = get_node(); // rest of code } 由于节点分配在这里的堆栈内存中,因此一旦函数结束,它就会消失。我想在以后跟踪那个节点,所以我想把它复制到堆中 TSNode* myFun() { TSNode node
typedef struct {
const void *data;
uint32_t offset[2];
} TSNode;
我有一个包含赋值的函数:
TSNode* myFun() {
TSNode node = get_node();
// rest of code
}
由于节点
分配在这里的堆栈内存中,因此一旦函数结束,它就会消失。我想在以后跟踪那个节点,所以我想把它复制到堆中
TSNode* myFun() {
TSNode node = get_node();
TSNode* heapNode = malloc(sizeof(TSNode));
memcpy(heapNode, &node, sizeof(TSNode));
return heapNode;
}
此内存是否将所有数据正确地分配到我分配的堆heapNode
?
i、 e.过程中没有任何损坏,*数据是否完好无损
这个memcpy是否将所有数据正确地分配到堆分配的heapNode?i、 e.过程中没有任何损坏,*数据是否完整
这个问题的答案是,memcpy
使用浅拷贝
概念。在浅复制中
原始结构(节点)中的指针TSNode node=get_node()代码>将逐位复制到新节点heapNode
(TSNode*heapNode
)也称为逐位复制。因此,新的heapNode
指针也将指向与原始节点(TSNode node=get_node();
)指针相同的位置,从中使用memcpy
复制值。因此,一旦控件从函数myFun
返回,原始节点将从内存中释放。因此,新节点指针将成为悬挂指针
。这是memcpy
这个函数的一个重要副作用get_node()代码>?答案是肯定的。是什么让你认为memcpy
会破坏任何东西?但这有点奇怪,请显示get_node()
,这取决于您可能需要一起做不同的事情。这是从ast返回根节点的函数的伪代码。不,memcpy
只是每个字节复制整个结构字节,这正是我们想要的。手动复制每个字段也是可能的,但速度较慢且容易出错。顺便说一下,不需要memcpy。只需分配:*heapnode=node代码>。我认为这是第一个ANSI C版本的一部分(最初的Kernighan/Ritchie C只允许两件事与结构相关:应用
运算符和&
运算符。无赋值,无参数传递)。也就是说,它已经有39年的历史了。我觉得自己老了。另一方面,data
指针成员是一个const
指针,因此它可能指向不应释放的常量数据。因此如果const void*data
不是常量,我需要进行深度复制?从函数返回后,数据
是否无效取决于get\u节点
分配的内容。返回的指针本身无论如何都不会悬空。@DavidRTribble,接得好。即使它是常量指针,也不再是常量。@塞内卡,使用深度复制概念