我有下面的结构C:深度复制 - 结构,空指针
struct teststruct
{
int *a;
void *data;
};
是否有可能做结构的深层复制,其中包含一个空指针?我假设我不知道指针指向多少个字节data
?所以我不能malloc指定的字节数和做memcpy。我对吗?
我有下面的结构C:深度复制 - 结构,空指针
struct teststruct
{
int *a;
void *data;
};
是否有可能做结构的深层复制,其中包含一个空指针?我假设我不知道指针指向多少个字节data
?所以我不能malloc指定的字节数和做memcpy。我对吗?
不可以。因为您不知道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;
如果您没有关于void *data
指向的数据大小的信息,我会说您无法成功深度复制此结构。
你是对的,你不知道有多少字节已被分配给data
。实际上,你甚至不能确定data
指向malloc()
ed内存;它可能指向堆,堆栈或全局空间上的任何内容。
即使你能找出数据的大小,你仍然无法知道内部数据的结构,这意味着一个适当的“深拷贝”将是不可能的。深度复制不会停留在第一个指针深度。
你是对的,但请区分:你可以做一个深拷贝,但你不能分辨指针指向多少个字节。
如何制作深层复印?目前还不知道该结构是否均匀。它不知道它是否是一个链表... – avp 2009-11-13 11:22:25
我对这个问题的性质。 “是否有可能做一个包含void指针的结构的深层副本?” - 对的,这是可能的。是否有可能知道有多少数据没有额外的字段 - 没有这是不可能的,至少如果它不是某种特殊数据,如空字符终止字符*或任何其他。 – doc 2009-11-13 13:52:19