Domanda

Ho un seguito struct

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

E 'possibile fare una copia completa di struttura che contiene un puntatore nullo? Suppongo che non posso dire quanti byte data puntatore punta a? Quindi non posso malloc determinato numero di byte e fare memcpy. Ho ragione?

È stato utile?

Soluzione

No. Dal momento che non si conosce il tipo che i punti di void * a, una copia profonda è fuori questione.

Inoltre, non si poteva a copia anche in profondità in quanto può puntare a un singolo int ot una serie di loro.

In genere in C, si avrebbe una struttura che porta i tipi di dati del suo contenuto, se si voleva essere in grado di fare copie profonde. Ad esempio:

struct teststruct {
    int a_sz;
    enum voidType vt;
    int *a;
    void *data;      
};

Poi si potrebbe usare a_sz per capire quanti interi memoria puntato da a era composta ed il tipo enumerato di data, anche se tecnicamente potrebbe anche essere un array quindi potrebbe essere necessario un d_sz pure.

Un altro trucco è quello di avere il punto data ad una struttura che porta il suo tipo di dati incorporato in esso, come ad esempio:

typedef struct {
    enum voidType vt;
    union {
        int i;
        float f;
        double d;
    }
} tVoidType;

Altri suggerimenti

Se si dispone di alcuna informazione sulla dimensione dei dati a cui punta void *data direi non è possibile con successo copia completa questa struct.

Hai ragione, non si può dire quanti byte sono stati stanziati per data. In realtà, non si può nemmeno essere sicuri che i punti data a malloc()ed di memoria; si potrebbe puntare a qualsiasi cosa sul mucchio, pila, o spazio globale.

Anche se si potrebbero scoprire la dimensione dei dati, non è ancora possibile conoscere la struttura dei dati interni, il che significa che una vera e propria "copia completa" sarebbe non essere possibile. Una copia profonda non si sarebbe fermato alla prima profondità di puntatore.

Hai ragione, ma per favore distinguere: è possibile effettuare una copia completa, ma non si può dire su quanti byte puntatore punta a

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top