Структура глубокой копии

Это может быть очень простой вопрос, но каким-то образом он меня обманул... когда я пишу тестовый код, он работает, но что-то не так в производстве.

// Header file
#define length 100
typedef struct testStr_t {
    int a;
    char b;
    char t1[length];
    char t2[length];
} test;

void populateTest(test*);

// source file
test test1;
test test2;
populateTest(&test1);
test2 = test1;

Будет ли test2 быть глубокой копией test1? Или здесь есть? Имеет ли значение, если код скомпилирован с компилятором C или компилятором С++?

Ответ 1

Глубоким копиям мешают только указатели, поэтому ваш struct будет скопирован правильно в C. Он также будет работать на С++, если вы не определите свой собственный operator=, который не копирует правильно. Вам нужно всего лишь определить operator= для типов с указателями, поскольку мелкая копия указателя скопирует указатель, но поделится данными.

Ответ 2

Мой ответ относится к С++. Я могу только догадываться, что он все еще подходит для C.

Это будет мелкая копия.

Если объекты содержат указатели t1 и t2, каждый из которых содержит местоположение некоторого непрямого, динамически выделенного блока памяти, вам понадобится глубокая копия.

Однако объекты содержат прямые объекты фактического времени массива, поэтому вы отлично разбираетесь в мелкой копии.

(Немного ошибочно, что это работает, но вы не можете вручную назначать объекты массива самостоятельно!)