【问题标题】:deep copy of struct with Pointer Point in CC中带有指针点的结构的深拷贝
【发布时间】:2013-02-17 17:34:53
【问题描述】:

我需要你的帮助!

我喜欢复制这样的结构:

typedef struct PackageObject_s {
  long  **vertex;          // vertices
  long    num_vertex;      // count of vertices
  long    objectType;      // 
  REAL    r;               // 
  long    bottom[3];       // bounding box bottom vector
  long    top[3];          // bounding box top vector
  long   *start;           // 
  REAL    coverage;        // 
} PackageObject __attribute__ ((aligned));

我是这样尝试的:

static inline void PackageObject_copy(PackageObject *dst, const PackageObject *src) {

  dst->num_vertex = src->num_vertex;
  dst->objectType = src->objectType;
  dst->r          = src->r;
  vec_assign3l(dst->bottom, src->bottom);
  vec_assign3l(dst->top,    src->top);

  // TODO copy **vertex ???

  dst->coverage   = src->coverage;
  dst->coverage   = src->coverage;
}

我该如何解决这个问题?

提前感谢您的帮助!!

更新 - 我对 vertex 进行深度复制的解决方案 - 感谢所有帮助:

dst->vertex = (long *)malloc(dst->num_vertex * 3 * sizeof(long));
for (long i=0; i < src->num_vertex; i++) { 
  dst->vertex[i] = (long)malloc(3*sizeof(long)); 
  memcpy(dst->vertex[i],src->vertex[i],3 * sizeof(long)); 
}

【问题讨论】:

  • 你需要复制**顶点?!
  • 感谢所有回答(@Sparky、@Foon、@eznme)。我明白了:-)
    ` dst->vertex = (long *)malloc(dst->num_vertex * 3 * sizeof(long)); for (long i=0; i num_vertex; i++) { dst->vertex[i] = (long)malloc(3*sizeof(long)); memcpy(dst->vertex[i],src->vertex[i],3 * sizeof(long)); }`

标签: c pointers struct deep-copy


【解决方案1】:

我将假设顶点不在对象之间共享。也就是说,它们属于有问题的结构。

有两种主要情况需要考虑:

1. Copying into a new object
2. Copying into an existing object

复制到新对象很简单。

1a. Allocate space for <num_vertex> pointers.
1b. Allocate space for each vertex.
2a. Copy <num_vertex> pointers from source to destination.
2b. Copy <num_vertex> vertices from source to destination.

复制到现有对象与复制到新对象非常相似,只是您必须先执行以下操作。

0a. Loop through each element of <vertex> and free the vertex.
0b. Free the array of vertex pointers.
1. Follow the steps for copying into a new object.

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    原答案:

    假设 vertex 指向一个顶点数组,并且每个顶点包含 3 个 long (x,y,z):

    dst->vertex = (long **)malloc(dst->num_vertex * 3 * sizeof(long);
    memcpy(dst,src,dst->num_vertex * 3 * sizeof(long));  
    

    更新,因为我意识到这可能有效,但不干净或特别安全 正如我在 cmets 中提到的,如果你有代码会更干净

    typedef struct vertextag { 
      long x;
      long y;
      long z;
    } vertex_type;
    

    然后做了: dst->vertex = (vertex_type *)malloc(dst->num_vertex * sizeof(vertex_type); memcpy(dst,src,dst->num_vertex * sizeof(vertex_type));

    【讨论】:

    • 查看其他一些答案,我没有考虑过两个案例。这个答案假设顶点数组对于每个对象都是唯一的(或者你真的不需要对其进行深度复制)。它还假设 dst 是一个全新的指针(但它指向您 malloc 或在堆栈上创建的一组有效内存);如果它不是一个全新的对象,你会想要使用 Sparky 的方法。请注意,如果 dst 不能保证是一个全新的对象,您应该检查是否 dst == src,或者至少在函数中记录它不要这样做,否则会泄漏内存。
    • 如果你有一个 struct vertex_type { long x, long y, long z)} 你的代码可能会更干净,你可以用它来代替 long[3] 作为边界框并用作 * vertex_type 而不是 long **;在这种情况下,你会做 (vertex_type *)malloc(dst->num_vertex * sizeof(vertex_type);
    • 没错。顶点数组对每个对象都是唯一的。每个对象都有 num_vertex 顶点。每个顶点都是一个 3D 坐标(长)。所以你的第一个解决方案不起作用。如果我改变一个顶点,我会在两个对象中用这个解决方案来改变它。
    【解决方案3】:

    这取决于顶点数组是否应该属于您尝试复制的对象,或者它是否在多个对象之间共享。这两种方法都在实践中使用,具体取决于情况(如果可以单独更改复制对象的顶点,则必须复制数组)。您必须选择其中哪些对您正在开发的应用程序有意义。

    如果数组可以被指向它们的对象共享,只需复制指针即可。

    dst->vertex = src->vertex;
    

    如果每个对象都有自己的顶点(因此可以为复制的对象单独更改它们),那么您必须分配和复制数组以及存储指针的位置,并将指向该位置的指针设置到副本中-对象。

    long* vertexCopy = malloc(howmanybytes);
    memcpy(vertexCopy, *src->vertex, howmanybytes);
    long** holder = malloc(sizeof(void*));
    holder[0] = vertexCopy;
    dst->vertex = holder;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-16
      • 2022-01-09
      • 2016-12-18
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多