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

Pip*_*pop 3 c void-pointers memcpy data-structures

我有一个以下的结构

struct teststruct
{
int *a;
void *data;      
};
Run Code Online (Sandbox Code Playgroud)

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

pax*_*blo 8

不会.由于您不知道void*指向的类型,因此无法使用深层副本.

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

通常在C中,如果您希望能够执行深层复制,那么您将拥有一个包含其内容的数据类型的结构.例如:

struct teststruct {
    int a_sz;
    enum voidType vt;
    int *a;
    void *data;      
};
Run Code Online (Sandbox Code Playgroud)

然后你可以用来a_sz计算内存指向的整数a和枚举类型的数量data,虽然从技术上讲它也可以是一个数组,所以你可能也需要一个d_sz.

另一个技巧是data指向一个嵌入其自身数据类型的结构,例如:

typedef struct {
    enum voidType vt;
    union {
        int i;
        float f;
        double d;
    }
} tVoidType;
Run Code Online (Sandbox Code Playgroud)


Tim*_*sch 5

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


Gre*_*ill 5

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

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