结构成员数组的深层副本

时间:2014-10-09 20:06:26

标签: c++ c arrays struct deep-copy

我刚刚在最近的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

1 个答案:

答案 0 :(得分:2)

是的,这确实是保证行为。数组指针。数组是连续的元素序列,其值是其所有元素的值。所以复制数组必须意味着复制它的所有元素。

您说使用=复制的C对象或函数参数始终被视为指针。这不太正确 - =无法复制C(和C ++)数组。并且函数不能具有数组类型的参数(或返回类型) - 这些参数总是调整为指针类型。并且数组类型的函数参数经历数组到指针的转换以匹配。

所以基本规则是:数组按值复制。异常部分是函数不能具有数组类型的参数(和返回值),而是以静默方式使用指针。