С:глубокое копирование — структура с пустым указателем
-
19-09-2019 - |
Вопрос
У меня есть следующая структура
struct teststruct
{
int *a;
void *data;
};
Можно ли сделать глубокую копию структуры, содержащей указатель void?Я предполагаю, что не могу сказать, сколько байтов data
указатель указывает на?Поэтому я не могу выделить указанное количество байтов и выполнить memcpy.Я прав?
Решение
Нет.Поскольку вы не знаете тип, на который указывает void*, о глубокой копии не может быть и речи.
Кроме того, вы не могли даже глубоко скопировать a
поскольку он может указывать либо на один int
а не их массив.
Обычно в C у вас будет структура, которая содержит типы данных ее содержимого, если вы хотите иметь возможность выполнять глубокие копии.Например:
struct teststruct {
int a_sz;
enum voidType vt;
int *a;
void *data;
};
Тогда вы могли бы использовать a_sz
чтобы выяснить, на сколько целых чисел указывает память a
состоял из и перечисленного типа data
, хотя технически это также может быть массив, поэтому вам может понадобиться d_sz
также.
Еще одна хитрость заключается в том, чтобы иметь data
укажите на структуру, которая содержит встроенный в нее собственный тип данных, например:
typedef struct {
enum voidType vt;
union {
int i;
float f;
double d;
}
} tVoidType;
Другие советы
Если у вас нет информации о размере данных, на которые указывает void *data
Я бы сказал, что вы не можете успешно скопировать эту структуру.
Вы правы, вы не можете сказать, сколько байт было выделено для data
.На самом деле, вы даже не можете быть уверены в том, что data
указывает на malloc()
Эд памяти;он может указывать на что угодно в куче, стеке или глобальном пространстве.
Даже если ты мог узнать размер данных, вы все равно не можете знать состав внутренних данных, а это означает, что правильное «глубокое копирование» будет невозможно.Глубокая копия не остановится на глубине первого указателя.
Вы правы, но, пожалуйста, различайте:вы можете сделать глубокую копию, но не сможете определить, на сколько байтов указывает указатель.