【问题标题】:What is the easiest way to do deep copy of a struct in C?在 C 中对结构进行深度复制的最简单方法是什么?
【发布时间】:2015-05-06 00:52:00
【问题描述】:

假设我有一个

struct A{
char *name;
unsigned long *trunks;
bool value;
const struct smap *smap;
...
...
}

这个结构有所有类型的数据结构,除了结构 A A*,我没有直接接触过这个结构,它是一个指向它的指针。

【问题讨论】:

  • 没有简单的方法。你必须自己写。
  • struct A A* 没有意义。解释清楚,你有什么,你没有。在任何情况下,如果不深入了解数据的组织方式,就不可能进行深度复制。 trunks 是什么?指向单独的unsigned long 的指针还是指向unsigned long 数组的指针?如果后者是真的,那么数组有多长?是所有成员指针都应该被深度复制还是只复制其中的一部分?
  • 是的,所有成员都要深度复制。我的意思是结构 A *A。 *trunks 是指向位图数组的指针。该结构有更多字段,但我正在尝试为所有字段找到通用解决方案。很多字段是在其他地方定义的,我没有所有的访问权限。
  • 我同意其他人的观点,即没有简单的方法。但是,如果这是您经常需要并且足够重要的东西,那么一种方法是编写一个 ELF 解析器来提取相关的结构信息并自动生成代码来进行复制。如果幸运的话,甚至可能已经有代码可以做到这一点。肯定有很多 ELF 解析器(例如 pyelftools),所以在最坏的情况下,您可以使用其中一个并添加到您的结构复制代码生成中。
  • 知道了。你能告诉我如何复制结构指针和其他指针吗?

标签: c struct deep-copy


【解决方案1】:

您必须以相同的方式(递归)将结构中的每个元素和所有引用的对象复制到新分配的结构中。

如果结构只有几个指针,您可以使用 memcpy 先复制所有元素,然后再复制所有引用的(通过指针)对象。如果有很多指针,手动复制每个字段可能会更有效。

引用的对象必须被视为相同(通过递归,迭代会非常讨厌)。但是,为此,您需要了解这些类型的结构。或者,在它们的实现文件中可能有所有这些对象的复制函数,从而使它们保持不透明。如果结构和复制功能都不可用,您会有些迷茫,因为没有它就无法检测指针。

如果存在循环引用,就会出现问题。然后事情变得更加复杂。

【讨论】:

  • 小挑剔:第一步不需要memcpy;你可以通过简单的赋值来做浅拷贝并保持类型安全。
  • @user694733:谢谢,我只是忘记了(不知道为什么)。是的,你是对的,这将实际方法留给编译器。
猜你喜欢
  • 2018-02-13
  • 2010-11-19
  • 2019-08-17
  • 2017-12-25
  • 2011-08-04
  • 2011-10-19
  • 1970-01-01
  • 2017-11-22
  • 2014-07-12
相关资源
最近更新 更多