Я нашел это поведение прямо сейчас, в недавнем 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
Да, это действительно гарантированное поведение. Массив не является указателем. Массив - непрерывная последовательность элементов, а его значение - значение всех его элементов. Поэтому копирование массива должно означать копирование всех его элементов.
Вы говорите, что объекты C, скопированные с помощью =
или как аргументы функции, всегда рассматриваются как указатель. Это не совсем корректно - массивы C (и C++) не могут быть скопированы на =
. И функции не могут иметь параметры (или возвращаемые типы) типа массива - они всегда настраиваются на тип указателя. И аргументы функции типа массива претерпевают преобразование массива в указатель для соответствия.
Итак, основное правило: массивы копируются по значению. Часть исключений состоит в том, что функции не могут иметь параметры (и возвращаемые значения) типа массива, вместо этого вместо этого используются указатели.
b.arr[0] = a.arr[0]; b.arr[1] = a.arr[1];
и т.п.