c - C语言中的浅拷贝和深拷贝

标签 c deep-copy shallow-copy

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

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

所以假设一个结构是

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

复制 char** 将是浅拷贝

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

我的想法是否正确,或者我离题太远了?谢谢。

最佳答案

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

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

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

关于c - C语言中的浅拷贝和深拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15278194/

相关文章:

c - 从 flex/bison 中释放在 strdup() 中分配的字符串

c - 从 curl_easy_perform() 获取数据的 libcurl 问题

c++ - 如何最好地处理未初始化内存的复制交换习语

c# - 如何创建 IEnumerable<T> 的浅拷贝?

c# - 在 C# 中将对象复制到 'this' 对象

java - 从 TreeMap 克隆对象中删除元素不会从 java 中的主树形图对象中删除

c - 错误指针 : is it okay to reserve random data to be used as error pointer?

c - 如何修复 C 中简单文件读/写程序的输出?

python - 从 Python 中的字典中的列表中删除一个元素

c# 线程安全深拷贝