3

我有一个以下结构

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

是否可以对包含 void 指针的结构进行深层复制?我假设我不知道data指针指向多少字节?所以我不能 malloc 指定的字节数并做 memcpy。我对吗?

4

4 回答 4

8

不,因为您不知道 void* 指向的类型,所以深拷贝是不可能的。

此外,您甚至无法进行深度复制a,因为它可能指向其中一个int或一个数组。

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

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

然后你可以用它a_sz来计算内存所指向的整数由多少个整数a组成,以及 的枚举类型data,尽管从技术上讲它也可以是一个数组,所以你可能也需要 a d_sz

另一个技巧是data指向一个结构,该结构中嵌入了它自己的数据类型,例如:

typedef struct {
    enum voidType vt;
    union {
        int i;
        float f;
        double d;
    }
} tVoidType;
于 2009-11-13T10:13:55.527 回答
5

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

于 2009-11-13T10:09:13.827 回答
5

您是对的,您无法确定已为 分配了多少字节data。事实上,你甚至不能确定它data指向malloc()ed 内存;它可能指向堆、堆栈或全局空间上的任何内容。

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

于 2009-11-13T10:09:34.903 回答
0

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

于 2009-11-13T10:15:25.720 回答