2009-11-13 140 views
3

我有下面的结构C:深度复制 - 结构,空指针

struct teststruct 
{ 
int *a; 
void *data;  
}; 

是否有可能做结构的深层复制,其中包含一个空指针?我假设我不知道指针指向多少个字节data?所以我不能malloc指定的字节数和做memcpy。我对吗?

回答

8

不可以。因为您不知道void *指向的类型,所以深层副本不存在问题。

此外,你甚至不能深度复制a,因为它可能指向一个单独的int或它们的数组。

通常在C中,如果您希望能够进行深层复制,您将拥有一个结构,该结构携带其内容的数据类型。例如:

struct teststruct { 
    int a_sz; 
    enum voidType vt; 
    int *a; 
    void *data;  
}; 

那么你可以使用a_sz找出多少整数内存指向a组成和枚举类型的data,虽然在技术上它也可能是一个数组,所以你可能需要一个d_sz

另一个技巧是有data点携带它嵌在它自己的数据类型,如结构:

typedef struct { 
    enum voidType vt; 
    union { 
     int i; 
     float f; 
     double d; 
    } 
} tVoidType; 
5

如果您没有关于void *data指向的数据大小的信息,我会说您无法成功深度复制此结构。

5

你是对的,你不知道有多少字节已被分配给data。实际上,你甚至不能确定data指向malloc() ed内存;它可能指向堆,堆栈或全局空间上的任何内容。

即使你找出数据的大小,你仍然无法知道内部数据的结构,这意味着一个适当的“深拷贝”将是不可能的。深度复制不会停留在第一个指针深度。

0

你是对的,但请区分:你可以做一个深拷贝,但你不能分辨指针指向多少个字节。

+1

如何制作深层复印?目前还不知道该结构是否均匀。它不知道它是否是一个链表... – avp 2009-11-13 11:22:25

+0

我对这个问题的性质。 “是否有可能做一个包含void指针的结构的深层副本?” - 对的,这是可能的。是否有可能知道有多少数据没有额外的字段 - 没有这是不可能的,至少如果它不是某种特殊数据,如空字符终止字符*或任何其他。 – doc 2009-11-13 13:52:19