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