C: cópia profunda - estrutura com um ponteiro vazio
-
19-09-2019 - |
Pergunta
Eu tenho uma estrutura seguinte
struct teststruct
{
int *a;
void *data;
};
É possível fazer uma cópia profunda da estrutura que contém um ponteiro vazio? Presumo que não sei dizer quantos bytes data
Ponteiro aponta para? Portanto, não posso Malloc número especificado de bytes e fazer memcpy. Estou certo?
Solução
Não. Como você não sabe o tipo que o vazio* aponta, uma cópia profunda está fora de questão.
Além disso, você não podia nem cópia profunda a
já que pode apontar para um único int
ou uma variedade deles.
Normalmente, em C, você teria uma estrutura que carrega os tipos de dados de seus conteúdos se desejasse poder fazer cópias profundas. Por exemplo:
struct teststruct {
int a_sz;
enum voidType vt;
int *a;
void *data;
};
Então você pode usar a_sz
Para descobrir quantos números inteiros a memória apontou por a
foi composto e o tipo enumerado de data
, embora tecnicamente também possa ser uma matriz, então você pode precisar de um d_sz
também.
Outro truque é ter data
aponte para uma estrutura que carrega seu próprio tipo de dados incorporado, como:
typedef struct {
enum voidType vt;
union {
int i;
float f;
double d;
}
} tVoidType;
Outras dicas
Se você não tiver informações sobre o tamanho dos dados apontados por void *data
Eu diria que você não pode copiar com sucesso esta estrutura.
Você está correto, você não pode dizer quantos bytes foram alocados para data
. Na verdade, você não pode nem ter certeza de que data
aponta para malloc()
Memória ED; Pode estar apontando para qualquer coisa na pilha, pilha ou espaço global.
Mesmo se você poderia Descubra o tamanho dos dados, você ainda não pode saber o estrutura Dos dados internos, o que significa que uma "cópia profunda" adequada não seria possível. Uma cópia profunda não parava na primeira profundidade do ponteiro.
Você está certo, mas por favor, distingue: você pode fazer uma cópia profunda, mas não pode dizer sobre quantos bytes ponteiros apontam.