Если под «мелкой копией» вы подразумеваете, что после присвоения struct
, содержащего массив, массив будет указывать на исходные данные struct
, тогда: это невозможно. Каждый элемент массива должен быть скопирован в новый struct
. «Мелкая копия» появляется на картинке, если в вашей структуре есть указатели. Если этого не произойдет, вы не сможете сделать поверхностную копию.
Когда вы присваиваете struct
, содержащему массив, какому-либо значению, он не может делать поверхностную копию, поскольку это будет означать присвоение массиву, что недопустимо. Таким образом, единственная копия, которую вы получаете, это глубокая копия.
Рассмотрим:
#include <stdio.h>
struct data {
char message[6];
};
int main(void)
{
struct data d1 = { "Hello" };
struct data d2 = d1; /* struct assignment, (almost) equivalent to
memcpy(&d2, &d1, sizeof d2) */
/* Note that it's illegal to say d2.message = d1.message */
d2.message[0] = 'h';
printf("%s\n", d1.message);
printf("%s\n", d2.message);
return 0;
}
Выше будет напечатано:
Hello
hello
Если, с другой стороны, у вашего struct
был указатель, присваивание struct
будет копировать только указатели, что является "мелкой копией":
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct data {
char *message;
};
int main(void)
{
struct data d1, d2;
char *str = malloc(6);
if (str == NULL) {
return 1;
}
strcpy(str, "Hello");
d1.message = str;
d2 = d1;
d2.message[0] = 'h';
printf("%s\n", d1.message);
printf("%s\n", d2.message);
free(str);
return 0;
}
Выше будет напечатано:
hello
hello
Как правило, данные struct T d1, d2;
, d2 = d1;
эквивалентны memcpy(&d2, &d1, sizeof d2);
, но если структура имеет заполнение, это может быть или не быть скопировано.
Редактировать : В C вы не можете назначить массивы . Дано:
int data[10] = { 0 };
int data_copy[10];
data_copy = data;
незаконно. Итак, как я сказал выше, если у вас есть массив в struct
, присваивание структуре должно копировать данные по элементам в массиве. Вы не получите мелкую копию в этом случае: нет смысла применять термин «мелкая копия» к случаю, подобному этому.