Назначить одну структуру другой в C

Можете ли вы назначить один экземпляр структуры другому, например так:

struct Test t1;
struct Test t2;
t2 = t1;

Я видел, как он работает для простых структур, но работает ли он для сложных структур?
Как знает ли компилятор, как копировать элементы данных в зависимости от их типа, т.е. различать int и строку?

134
задан Eitan T 4 July 2012 в 16:44
поделиться

4 ответа

Да, если структура одного типа. Считайте это копией памяти.

138
ответ дан 23 November 2019 в 23:54
поделиться

Да, для структур поддерживается присваивание. Однако есть проблемы:

struct S {
   char * p;
};

struct S s1, s2;
s1.p = malloc(100);
s2 = s1;

Теперь указатели обеих структур указывают на один и тот же блок памяти - компилятор не копирует указанные в данные. Теперь трудно понять, какой экземпляр структуры владеет данными. Вот почему C ++ изобрел концепцию определяемых пользователем операторов присваивания - вы можете написать специальный код для обработки этого случая.

132
ответ дан 23 November 2019 в 23:54
поделиться

Это простое копирование, такое же, как вы делаете с помощью memcpy() (действительно, некоторые компиляторы фактически производят вызов memcpy() для этого кода). В Си нет "строки", есть только указатели на кучу символов. Если ваша исходная структура содержит такой указатель, то копируется указатель, а не сами символы.

15
ответ дан 23 November 2019 в 23:54
поделиться

Вы имели в виду "Complex" как комплексное число с действительной и мнимой частями? Это кажется маловероятным, так что если нет, то вам придется привести пример, поскольку "комплексное" не означает ничего конкретного с точки зрения языка Си.

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

Чтобы выполнить "умное" копирование (или "глубокое" копирование), необходимо реализовать функцию для выполнения копирования. Это может быть очень сложно, если сама структура содержит указатели и структуры, которые также содержат указатели, и, возможно, указатели на такие структуры (возможно, это то, что вы подразумеваете под словом "сложный"), и это трудно поддерживать. Простым решением является использование C++ и реализация конструкторов копирования и операторов присваивания для каждой структуры или класса, тогда каждая из них становится ответственной за свою собственную семантику копирования, вы можете использовать синтаксис присваивания, и это более легко поддерживать.

6
ответ дан 23 November 2019 в 23:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: