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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top