我试着用谷歌搜索这个,但只有反对的面向语言作为结果弹出。浅拷贝和深拷贝在C
从我的理解,浅拷贝复制结构的某些成员。
因此可以说,一个结构是
typedef struct node
{
char **ok;
int hi;
int yep;
struct node *next;
}node_t
复制的字符**会是一个浅拷贝
但复制整个链表将是一个深拷贝?
我有正确的想法还是我的方式?谢谢。
我试着用谷歌搜索这个,但只有反对的面向语言作为结果弹出。浅拷贝和深拷贝在C
从我的理解,浅拷贝复制结构的某些成员。
因此可以说,一个结构是
typedef struct node
{
char **ok;
int hi;
int yep;
struct node *next;
}node_t
复制的字符**会是一个浅拷贝
但复制整个链表将是一个深拷贝?
我有正确的想法还是我的方式?谢谢。
编号在这个特定的上下文中的浅拷贝意味着你将“引用”(指针,任何)复制到对象,并且这些引用或指针的后备存储是相同的,它是同一个内存位置上的同一个对象。
相反,深层复制意味着您复制整个对象(结构体)。如果它的成员可以被复制为浅的或深的,你也可以对其进行深层次的复制。考虑以下示例:
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
复制构造函数用于使用先前创建的同一个类的对象初始化新对象。默认情况下编译器写了一个浅拷贝。浅拷贝在没有涉及动态内存分配时工作正常,因为当涉及动态内存分配时,两个对象将指向堆中的同一内存位置。因此,为了消除这个问题,我们写了深拷贝,因此两个对象都有自己的属性副本在记忆中。为了阅读完整的例子和解释的细节,你可以看到这篇文章的部分关于Shallow and Deep copy constructors之间的区别。