2009-11-13 3 views
3

Я получил следующую структуруC: глубокое копирование - структура с указателем ничтожной

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

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

ответ

8

Нет. Так как вы не знаете тип, на который указывает пустота *, то глубокая копия не может быть и речи.

Кроме того, вы не могли даже выполнить глубокую копию 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

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

5

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

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

0

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

+1

Как вы можете сделать глубокую копию? Неизвестно, является ли структура однородной. Неизвестно, является ли он связанным списком ... – avp

+0

Я был в характере вопроса. «Возможно ли сделать глубокую копию структуры, которая содержит указатель на пустоту?» - Да, это возможно. Можно ли рассказать, сколько данных отсутствует без дополнительного поля - нет, это невозможно, по крайней мере, если это не какие-то специальные данные, такие как null char terminated char * или что-то еще. – doc

 Смежные вопросы

  • Нет связанных вопросов^_^