C:深度复制 - 带有空指针的结构

时间:2009-11-13 10:07:50

标签: c data-structures memcpy void-pointers

我有一个以下结构

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

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

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分:5)

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

答案 2 :(得分:5)

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

即使您可以找出数据的大小,您仍然无法知道内部数据的结构,这意味着正确的“深层复制”会不可能。深拷贝不会在第一个指针深度处停止。

答案 3 :(得分:0)

你是对的,但请区分:你可以做一个深层复制,但是你无法判断指针指向的字节数。