【问题标题】:Shallow copy and deep copy in CC中的浅拷贝和深拷贝
【发布时间】:2013-03-07 17:49:31
【问题描述】:

我尝试用谷歌搜索,但只弹出面向对象的语言作为结果。

据我了解,浅拷贝是复制结构的某些成员。

所以我们说一个结构是

typedef struct node
{
    char **ok;
    int hi;
    int yep;
    struct node *next;
}node_t

复制 char** 将是浅拷贝

但是复制整个链表会是深拷贝吗?

我的想法是正确的还是离题了?谢谢。

【问题讨论】:

    标签: c deep-copy shallow-copy


    【解决方案1】:

    没有。在此特定上下文中的浅拷贝意味着您将“引用”(指针等)复制到对象,并且这些引用或指针的后备存储是相同的,它是相同内存位置的相同对象。

    相比之下,深拷贝意味着您复制整个对象(结构)。如果它具有可以浅拷贝或深拷贝的成员,您还可以对它们进行深层拷贝。考虑以下示例:

    typedef struct {
        char *name;
        int value;
    } Node;
    
    Node n1, n2, n3;
    
    char name[] = "This is the name";
    
    n1 = (Node){ name, 1337 };
    n2 = n1; // Shallow copy, n2.name points to the same string as n1.name
    
    n3.value = n1.value;
    n3.name = strdup(n1.name); // Deep copy - n3.name is identical to n1.name regarding
                               // its *contents* only, but it's not anymore the same pointer
    

    【讨论】:

      【解决方案2】:

      复制构造函数用于用之前创建的同一个类的对象来初始化新对象。默认情况下编译器写了一个浅拷贝。当不涉及动态内存分配时,浅拷贝工作正常,因为当涉及动态内存分配时,两个对象将指向堆中的相同内存位置,因此为了解决这个问题,我们编写了深拷贝,因此两个对象都有自己的属性副本记忆中。为了阅读带有完整示例和解释的详细信息,您可以查看本文中关于Shallow and Deep copy constructors 之间区别的部分。

      【讨论】:

      • 这篇文章专门针对 C 语言。构造函数和复制构造函数是独有的 C++(和 oop)特性。您的答案虽然解释得很好,但在这种情况下可能会完全误导。我很抱歉,但它值得反对
      • 同意@kyriakosSt,Post 与ShadyBears 最初提出的问题完全无关。
      猜你喜欢
      • 2012-04-12
      • 2015-01-13
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      相关资源
      最近更新 更多