Глубокая копия массивов членов Struct

0

Я нашел это поведение прямо сейчас, в недавнем 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
    Да, это гарантировано. Это не «глубокое» копирование. Это просто «копирование».
  • 0
    Вам не следует задавать вопрос о двух разных языках, если вы заботитесь о обоих, у вас должно быть два разных вопроса.
Показать ещё 3 комментария
Теги:
arrays
struct
deep-copy

1 ответ

2
Лучший ответ

Да, это действительно гарантированное поведение. Массив не является указателем. Массив - непрерывная последовательность элементов, а его значение - значение всех его элементов. Поэтому копирование массива должно означать копирование всех его элементов.

Вы говорите, что объекты C, скопированные с помощью = или как аргументы функции, всегда рассматриваются как указатель. Это не совсем корректно - массивы C (и C++) не могут быть скопированы на =. И функции не могут иметь параметры (или возвращаемые типы) типа массива - они всегда настраиваются на тип указателя. И аргументы функции типа массива претерпевают преобразование массива в указатель для соответствия.

Итак, основное правило: массивы копируются по значению. Часть исключений состоит в том, что функции не могут иметь параметры (и возвращаемые значения) типа массива, вместо этого вместо этого используются указатели.

  • 0
    Массивы не могут быть скопированы по значению, но происходит то, что одни и те же правила копирования применяются к членам рекурсивно. Так что в итоге происходит b.arr[0] = a.arr[0]; b.arr[1] = a.arr[1]; и т.п.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню