2013-02-17 95 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;