深拷貝和淺拷貝

2021-08-11 13:19:31 字數 908 閱讀 8182

#include

#include

#include

#include//測試記憶體洩漏

int main()

for(i=0;i<3;i++)

*/測試:

輸入:aaa

bbbccc

輸出:ccc

cccccc

想要輸出的是aaa bbb ccc,但是實際輸出的卻是 ccc ccc ccc,就是因為淺拷貝的問題,arr是乙個指標陣列,存放的是buf的位址,buf的位址是恆定的,假設是1000,那迴圈三次都是1000,但是裡面的內容發生了改變,原來是aaa,但是再輸入bbb的時候,就覆蓋了aaa,同樣ccc也覆蓋了bbb,所以最後buf裡面存放的只有ccc,而arr是buf的位址1000,所以每次存進去的都是1000,輸出陣列的時候,就全是ccc了。這就是淺拷貝,實質就是多個指標指向同一段記憶體。

scanf從輸入留緩衝區讀取數值,如果輸入緩衝區有數,它就可以用,沒有數值或者數值不足,就要等待。緩衝區的數是從鍵盤緩衝區裡來的。鍵盤緩衝區的資料只有遇到回車才送入輸入流緩衝區,否則留在鍵盤緩衝區,不會到輸入流緩衝區。所以scanf並不是一定要等回車,scanf只是等輸入流緩衝區有數取,鍵盤一次輸入很多數,回車,輸入流緩衝區就有很多數了。scanf讀數以空白為數的分隔符,空格,回車屬於空白,回車對於scanf來說,只是數的分隔符而已。

//深拷貝:每個指標指向單獨的記憶體

如果想要把輸入的值都輸出來怎麼辦,首先就是要建立乙個和輸入字元相等長度的陣列儲存這個字串,再將鍵盤讀取的資料拷貝到新的陣列中去,然後陣列arr的值儲存新陣列的位址,就可以對它們分別進行訪問了。這就是深拷貝,每個指標指向單獨的記憶體。

for(i=0;i<3;i++)

for(i=0;i<3;i++)

for(i=0;i<3;i++)

return 0; }

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...

淺拷貝和深拷貝

以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...

深拷貝和淺拷貝

ios提供了copy和mutablecopy方法,顧名思義,copy就是複製了乙個imutable的物件,而mutablecopy就是複製了乙個mutable的物件。以下將舉幾個例子來說明。1 系統的非容器類物件 這裡指的是nsstring nsnumber等等一類的物件。nsstring stri...