【发布时间】:2011-01-14 02:33:54
【问题描述】:
我在 C 语言中有一个图形结构,并且想要对其进行深层复制(包括节点和边)。
结构如下:
struct li_list {
struct li_node n;
};
struct li_node {
struct li_node *next, *prev;
};
struct gr_graph {
struct li_list nodes;
int nodecount;
};
struct gr_node {
struct li_node node;
struct gr_graph *graph;
int pred_count, succ_count;
struct li_list pred, succ;
};
struct gr_edge {
struct li_node succ, pred;
struct gr_node *from, *to;
unsigned long marks;
};
这些结构本身并不存在,而是“继承”在另一个结构中,如下所示:
struct ex_node {
struct gr_node _; // "Superclass"
int id;
struct ex_node *union_find_parent;
...
}
有没有一种优雅的解决方案来创建这样一个结构的深层副本,包括更新对副本的引用?
注意:嵌套结构的成员不指向它包含的根结构,而是指向它们相关的嵌套结构(例如,ex_node._.pred.n.next 指向ex_edge._.pred)。这意味着当必须更新这些时,需要进行繁琐的指针运算。
到目前为止我的解决方案是
- Memcopy 所有结构
- 遍历所有副本
- 为所有包含引用的字段调用一堆宏(由于 C 中缺少 RTTI,我可能不会解决这个问题)
- 宏使用
-
offsetof计算根结构体的地址 - 检索复制的等价物的地址
-
offsetof使指针指向正确的嵌套结构
-
有没有更简单的方法来做到这一点?我也怕我添加更多字段时忘记添加宏调用。
【问题讨论】:
标签: c