【问题标题】:C: deep copying - structure with a void pointerC: 深拷贝 - 带有 void 指针的结构
【发布时间】:2010-12-16 05:52:54
【问题描述】:

我有一个下面的结构

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

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

【问题讨论】:

    标签: c data-structures memcpy void-pointers


    【解决方案1】:

    没有。由于您不知道 void* 指向的类型,因此无法进行深拷贝。

    此外,您甚至无法深度复制 a,因为它可能指向单个 int 或它们的数组。

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 如何进行深拷贝?不知道结构是否均匀。不知道是不是链表...
          • 我是这个问题的性质。 “是否可以对包含空指针的结构进行深层复制?” - 对的,这是可能的。是否可以在没有附加字段的情况下判断有多少数据 - 不,这是不可能的,至少如果它不是某种特殊数据,如空字符终止 char* 或其他什么。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-09
          • 2016-12-18
          • 2015-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-28
          相关资源
          最近更新 更多