c 使用指针从堆栈复制结构到堆

标签 c heap-memory

给定以下类型

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/

相关文章:

python - 尝试从 C 调用 Python

c - OSX Hid : List of possible usage pages, 我在哪里可以找到它?(即 kHIDUsage_GD_GamePad 等)

C 宏 : #if check for equality

c - 二叉树的结构分配

java - Android TaskManager 将显示当前内存使用情况和 CPU 使用情况

java - 评估 R 中从 Java 调用的表达式。内存不足错误 : Java Heap

c - 为什么 C 编译器在为有符号类型分配过高的整数值时不发出警告?

arrays - Linux需要多长时间清理堆内存

java - 如何使用jstat获取堆使用情况?

java - 如何在运行时查找堆/堆栈中对象的强引用数