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,接得好。即使它是常量指针,也不再是常量。@塞内卡,使用深度复制概念