Как скопировать структуру typedef в другую? - PullRequest
0 голосов
/ 30 января 2019

Как скопировать структуру typedef в другую?

Если у меня есть структура typedef с именем books, и у меня есть переменная структуры с именем books first.Теперь я объявляю books second Как я могу передать содержимое с первого на второе?Есть ли функция, чтобы сделать это, или я могу сделать это только с second = first?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Если ваша структура не содержит элементов, которые являются указателями (или содержат структуры, которые имеют), то вы можете просто назначить один элемент другому.

second = first;

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

Например:

struct book {
    char *name;
    int cost;   // in cents, so you don't have to deal with floating point issues
};

struct book first;
first.name = strdup("title1");
first.cost = 500;

struct book second;
second.name = strdup(first.name);
second.cost = first.cost;
0 голосов
/ 30 января 2019

Если оба типа first и second имеют одинаковый тип, тогда вы можете просто сделать second = first;.Не имеет значения, является ли тип встроенным или определенным пользователем.C скопирует содержимое first в second.Просто попробуйте.

В общем случае переменные в C - это просто данные с именем и типом.Если типы 2 переменных a и b совпадают, вы можете назначить одну другую: a = b;.Что происходит, так это то, что значение переменной b копируется в переменную a.

Но остерегайтесь указателей: для C указатели - это просто переменные со значением (тот факт, что значение представляет адрес памятине имеет значения, C рассматривает все данные как равные).Если две переменные являются указателями, например char *a; char *b;, тогда вы можете назначить a = b; просто с любой переменной.Но поскольку значение переменной b является адресом памяти, адрес памяти копируется из b в a, а не содержимое памяти по адресу памяти.

Если вы хотитескопировав память, вам придется делать это самостоятельно, например, с помощью memcpy() (см. справочную страницу на нем).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...