C: глубокое копирование - структура с пустым указателем - PullRequest
3 голосов
/ 13 ноября 2009

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

struct teststruct
{
int *a;
void *data;      
};

Можно ли сделать глубокую копию структуры, которая содержит пустой указатель? Я предполагаю, что не могу сказать, сколько байтов указывает указатель data? Поэтому я не могу malloc указанное количество байтов и сделать memcpy. Я прав?

Ответы [ 4 ]

8 голосов
/ 13 ноября 2009

Нет. Поскольку вы не знаете тип, на который указывает 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;
5 голосов
/ 13 ноября 2009

Вы правы, вы не можете сказать, сколько байтов было выделено для data. На самом деле, вы даже не можете быть уверены, что data указывает на malloc() ed памяти; это может указывать на что-либо в куче, стеке или глобальном пространстве.

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

5 голосов
/ 13 ноября 2009

Если у вас нет информации о размере данных, на которые указывает void *data Я бы сказал, что вы не можете успешно глубоко копировать эту структуру.

0 голосов
/ 13 ноября 2009

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

...