2013-03-07 203 views
8

我試着用谷歌搜索這個,但只有反對的面向語言作爲結果彈出。淺拷貝和深拷貝在C

從我的理解,淺拷貝複製結構的某些成員。

因此可以說,一個結構是

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

複製的字符**會是一個淺拷貝

但複製整個鏈表將是一個深拷貝?

我有正確的想法還是我的方式?謝謝。

回答

13

編號在這個特定的上下文中的淺拷貝意味着你將「引用」(指針,任何)複製到對象,並且這些引用或指針的後備存儲是相同的,它是同一個內存位置上的同一個對象。

相反,深層複製意味着您複製整個對象(結構體)。如果它的成員可以被複製爲淺的或深的,你也可以對其進行深層次的複製。考慮以下示例:

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 
0

複製構造函數用於使用先前創建的同一個類的對象初始化新對象。默認情況下編譯器寫了一個淺拷貝。淺拷貝在沒有涉及動態內存分配時工作正常,因爲當涉及動態內存分配時,兩個對象將指向堆中的同一內存位置。因此,爲了消除這個問題,我們寫了深拷貝,因此兩個對象都有自己的屬性副本在記憶中。爲了閱讀完整的例子和解釋的細節,你可以看到這篇文章的部分關於Shallow and Deep copy constructors之間的區別。