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