结构成员数组的深度复制

Deep Copy of Struct Member Arrays

本文关键字:深度 复制 数组 成员 结构      更新时间:2023-10-16

我刚刚在最近的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 %dn", a.arr[i], b.arr[i]);
    }
    return EXIT_SUCCESS;
}

将输出,

1 0
2 0
3 3
4 4
5 5

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

您的意思是,使用=或作为函数参数复制的C对象始终被视为指针。这不太正确——=无法复制C(和C++)数组。函数不能有数组类型的参数(或返回类型)-这些参数总是调整为指针类型。数组类型的函数参数要经过数组到指针的转换才能匹配。

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