С:глубокое копирование — структура с пустым указателем

StackOverflow https://stackoverflow.com/questions/1728307

Вопрос

У меня есть следующая структура

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()Эд памяти;он может указывать на что угодно в куче, стеке или глобальном пространстве.

Даже если ты мог узнать размер данных, вы все равно не можете знать состав внутренних данных, а это означает, что правильное «глубокое копирование» будет невозможно.Глубокая копия не остановится на глубине первого указателя.

Вы правы, но, пожалуйста, различайте:вы можете сделать глубокую копию, но не сможете определить, на сколько байтов указывает указатель.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top