2014-10-09 79 views
0

我剛剛在最近的gcc中發現了這種行爲。結構成員數組的深度複製

C/C++標準的這種深層複製保證行爲是否可以依賴?

[編輯]這種行爲的邏輯是什麼? C數組對象與=運算符一起復制或作爲函數參數總是被視爲一個普通指針。結構成員有什麼不同?

#include <stdio.h> 
#include <stdlib.h> 

typedef struct 
{ 
    int arr[5]; 
} 
array; 

int main(void) 
{ 
    array a = {{ 1, 2, 3, 4, 5}}; 
    array b; 
    int i; 

    b = a; 
    b.arr[0] = 0; 
    b.arr[1] = 0; 
    for (i = 0; i < 5; i++) 
    { 
     printf("%d %d\n", a.arr[i], b.arr[i]); 
    } 
    return EXIT_SUCCESS; 
} 

將輸出,

1 0 
2 0 
3 3 
4 4 
5 5 
+0

是的,它是有保證的。它不是「深」複製它只是「複製」。 – juanchopanza 2014-10-09 20:07:42

+0

你不應該問一個關於兩種不同語言的問題,如果你關心這兩種語言,應該有兩個不同的問題。 – Vality 2014-10-09 20:32:04

+1

@Vality如果這個_specific_問題只被要求使用其中一種語言,答案會不同嗎? – xiver77 2014-10-09 20:43:39

回答

2

是的,這確實是保證行爲。一個數組是而不是的指針。數組是一個連續的元素序列,其值是其所有元素的值。所以複製數組必須意味着複製其所有元素。

你說的C對象複製=或作爲函數參數總是被視爲一個指針。這不太正確 - C(和C++)數組不能被=複製。並且函數不能有數組類型的參數(或返回類型) - 它們總是被調整爲指針類型。並且數組類型的函數參數經歷數組到指針的轉換以匹配。

所以基本的規則是:數組被按值複製。異常部分是函數不能具有數組類型的參數(和返回值),而是靜靜地使用指針。

+0

數組無法按值複製,但會發生什麼情況是相同的複製規則會遞歸應用於成員。所以最終發生的是'b.arr [0] = a.arr [0]; b.arr [1] = a.arr [1]; '等 – 2014-10-09 21:59:22