C: copia profonda - struttura con un puntatore nullo
-
19-09-2019 - |
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?
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
.