我試着用谷歌搜索這個,但只有反對的面向語言作爲結果彈出。淺拷貝和深拷貝在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之間的區別。