C語言 淺拷貝和深拷貝

2021-08-20 03:06:06 字數 1062 閱讀 9423

淺拷貝

首先看下面這段**:

# include# include#include typedef struct node//定義了乙個結構體

s_node;

int main()

執行結果為:

node2=node1;僅僅完成淺拷貝(僅會將結構體變數的size,data儲存的值給node2)

data指向的空間以及其儲存的資料並不會拷貝,即只是拷貝了8個位元組,如下圖,node2.size=node1.size=11,node2.data=node1.data都儲存的只是位址1000。

當free(node1.data),後free(node2.data),程式會報錯。原因是free(node1.data);已經將所申請的空間釋放掉了,當執行free(node2.data);就會重複釋放。所以結構體一般不允許直接賦值。

深拷貝

同樣分析下面這段**:

# include# include# include#include typedef struct node//結構體

s_node;

void copynode(s_node *node3, s_node node1)//copynode 函式實現結構體變數的深拷貝

int main()

node塊空間來儲存node.data的資料,並不是淺拷貝中僅僅拷貝位址。

執行結果為:

C語言中深拷貝和淺拷貝

1 淺拷貝指的是多個指標指向同一段記憶體 比如字串常量,字串常量在乙個工程中,不管定義多少次,在記憶體只有乙份,它屬於淺拷貝。下面就舉乙個淺拷貝的例子 定義乙個陣列buf,從鍵盤輸入三個字串,並將其拷貝到陣列arr中。它輸出的是三個第三次輸入的,而沒有輸出前兩次輸入的,分析一下原因 其中的buf相當...

C 淺拷貝和深拷貝

class test test const test t val new int t.val test private int val 現在定義兩個物件,test t1 9 test t2 t1 如果你不提供copy建構函式 注釋掉的那個 那麼t1和t2的成員 val指向同乙個物件,當析構的時候,同...

c 深拷貝和淺拷貝

深拷貝和淺拷貝 ca const ca c 就是我們自定義的拷貝建構函式。可見,拷貝建構函式是一種特別的建構函式,函式的名稱必須和類名稱一致,他的唯一的乙個引數是本型別的乙個引用變數,該引數是const型別,不可變的。例如 類x的拷貝建構函式的形式為x x x 當用乙個已初始化過了的自定義類型別物件...