c++ - 结构成员数组的深拷贝

标签 c++ c arrays struct deep-copy

我刚刚在最近的 gcc 中发现了这种行为。

这种由 C/C++ 标准保证的深度复制行为是否值得信赖?

[edit] 这种行为背后的逻辑是什么?当使用 = 运算符或作为函数参数复制时,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

最佳答案

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

你是说用 = 复制的 C 对象或作为函数参数总是被视为指针。这不太正确 - C(和 C++)数组不能由 = 复制。并且函数不能有数组类型的参数(或返回类型)——它们总是被调整为指针类型。数组类型的函数参数经过数组到指针的转换以匹配。

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

关于c++ - 结构成员数组的深拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26287077/

相关文章:

c - C语言中main方法中参数的目的是什么

Javascript:从存储在 localStorage 中的数组中删除对象?

c++ - 输出逻辑错误

c++ - 将for循环转换为递归(C++)

c - cygwin 上的内存泄漏工具

无法使 libc 覆盖功能与 LD_PRELOAD 一起使用?

c# - 如何将多个字节数组组合成一个以创建文件

arrays - 具有数组公式的列中的可编辑单元格

c++ - 指向类对象的空指针: Initialization inside a function

c++ - Oculus Rift/Vulkan : Write to swapchain with a compute shader