2013-02-17 111 views
5

我需要你的帮助!C指针结构的深层副本

我想复制这样的结构:

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; 
} 

我怎么能解决这个问题?

预先感谢您的帮助!

更新 - 我的deepcopy的的vertex解决方案 - THX的所有帮助:

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)); 
} 
+0

你需要复制**顶点?! – amrfaissal 2013-02-17 17:39:25

+0

感谢您的所有答案(@Sparky,@Foon,@eznme)。我知道了:-)
'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)); }' – romi1013 2013-02-18 08:38:45

回答

2

我打算假设顶点不在对象之间共享。也就是说,它们属于所讨论的结构。

有两种主要情况来考虑是:

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

原来的答复:

假设顶点到顶点数组,而每个顶点包含3个多头(X ,Y,Z):

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

更新,因为我意识到这可能会奏效,但不干净或者特别安全 正如我所提到的评论,如果您有

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

,然后做代码将是清洁: dst->顶点=(vertex_type *)malloc的(dst-> num_vertex *的sizeof(vertex_type);memcpy(dst,src,dst-> num_vertex * sizeof(vertex_type));

+0

回顾一些其他的答案,我没有想过两种情况。这个答案假定顶点数组对每个对象都是唯一的(或者你不需要深入拷贝它)。它还假设dst是一个全新的指针(但它指向的是你在malloc或d上创建的一组有效内存);如果它不是一个全新的对象,那么你会希望采用Sparky的方法。请注意,如果dst不能保证是一个全新的对象,或者至少要在函数中记录它,否则你应该检查dst == src是否会泄漏内存。 – Foon 2013-02-17 22:56:14

+0

如果您有一个struct vertex_type {long x,long y,long z)},您可能会更清洁您将使用的代替long [3]的边界框,并使用as * vertex_type而不是long **;在这种情况下,你可以这样做(vertex_type *)malloc(dst-> num_vertex * sizeof(vertex_type); – Foon 2013-02-17 22:59:01

+0

这是正确的:顶点数组对每个对象都是唯一的,每个对象都有num_vertex顶点,每个顶点都是3D坐标)。所以你的第一个解决方案不起作用。如果我改变了一个顶点,我用这个解决方案在两个对象中改变它。 – romi1013 2013-02-18 07:56:13

1

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

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

dst->vertex = src->vertex; 

如果每个对象都有自己的顶点(因此它们可以被单独用于复制的对象改变),那么你必须分配和复制阵列,并且其中所述指针被存储的地方,设置一个指针到那个地方到复制对象中。

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