首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言中的浅拷贝和深拷贝

C语言中的浅拷贝和深拷贝
EN

Stack Overflow用户
提问于 2013-03-08 01:49:31
回答 2查看 41.8K关注 0票数 14

我试着用谷歌搜索这个,但只有面向对象的语言才会弹出结果。

据我所知,浅层复制就是复制结构的某些成员。

因此,假设一个结构是

代码语言:javascript
复制
typedef struct node
{
    char **ok;
    int hi;
    int yep;
    struct node *next;
}node_t

复制char**将是浅层复制

但是复制整个链表将是一次深度复制吗?

我的想法是对的,还是说错了?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-08 01:57:18

不是的。在此特定上下文中的浅层复制意味着您将“引用”(指针,无论什么)复制到对象,并且这些引用或指针的后备存储是相同的,它是相同内存位置上的完全相同的对象。

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

代码语言:javascript
复制
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
票数 30
EN

Stack Overflow用户

发布于 2014-02-08 21:22:21

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15278194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档