我刚刚在最近的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
答案 0 :(得分:2)
是的,这确实是保证行为。数组不指针。数组是连续的元素序列,其值是其所有元素的值。所以复制数组必须意味着复制它的所有元素。
您说使用=
复制的C对象或函数参数始终被视为指针。这不太正确 - =
无法复制C(和C ++)数组。并且函数不能具有数组类型的参数(或返回类型) - 这些参数总是调整为指针类型。并且数组类型的函数参数经历数组到指针的转换以匹配。
所以基本规则是:数组按值复制。异常部分是函数不能具有数组类型的参数(和返回值),而是以静默方式使用指针。