2014-10-09 78 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