结构成员数组的深度复制
Deep Copy of Struct Member Arrays
我刚刚在最近的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++)数组。函数不能有数组类型的参数(或返回类型)-这些参数总是调整为指针类型。数组类型的函数参数要经过数组到指针的转换才能匹配。
因此,基本规则是:数组是按值复制的。异常部分是函数不能具有数组类型的参数(和返回值),而是以静默方式使用指针。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- C++尝试深度复制唯一指针时出现内存访问冲突
- 在 c++ 中使用深度复制的运算符重载
- 如何深度复制链表对象指针
- 我有两棵二叉树.我想在不更改输入树的情况下深度复制两个二叉树的结果
- 如何将结构深度复制到向量的每个元素
- 我需要做一个深度复制,我是否正确使用了我的复制构造函数?
- 是否可以在不显式迭代每个元素的情况下深度复制指针容器?
- 如何深度复制unique_ptr向量
- 二叉搜索树 深度复制和取消引用
- 链表的这个别名运算符是否会产生深度复制
- 有没有一种 stl 方法来执行指针向量的深度复制
- cv::P oint3f 赋值运算符是否执行"深度"复制?
- Qt:通过深度复制访问列表中的数据结构是否应该比通过指针访问它慢得多
- 深度复制包含引用成员(C++)的结构
- 如何将“char *”深度复制到std::stringstream
- 如何在双向链表上执行深度复制
- 在复制构造函数中执行深度复制
- 深度复制cv::垫子替代品,哪个更好?
- 在 C/C++ 中使用 ProtoBuf 进行深度复制