Ho cercato per un po 'di concatenare alcune variabili di tipo struct (ho definito) in una più grande. Quello che ho ottenuto è fondamentalmente così:
Ho una struttura e due variabili di tipostruct **. Dichiaro una terza struct C e voglio concatenare A e B in C. Quello che ho provato è qualcosa di simile a questo (non ho il codice di fronte a me in questo momento, quindi scriverò qualcosa di molto simile con alcuni nomi modificati perché non li ricordo.
struct** A, B;
struct** C;
(Conosco A e B mentre li ricevo chiamando un'altra funzione)
Alloco memoria per C in questo modo.
C = (struct**)malloc(sizeof(A)+sizeof(B));
E muovo A e B con memcpy come questo.
memcpy(&C, &A, sizeof(A));
memcpy(&C + sizeof(A), &C, sizeof(B));
È ovvio che quello che ho fatto non è correttocome sembra, dopo tutto questo C contiene solo A. Sono abbastanza sicuro che il problema sia da "**", non riesco a gestire bene i puntatori ai puntatori. Qualcuno può darmi qualche consiglio riguardo al mio problema? Anche io non voglio usare Handles, devo usare memcpy / memmove.
[aggiorna dal commento:]
Le mie strutture sono tutte dello stesso tipo.
risposte:
3 per risposta № 1Hai già un struct A a;
e a struct B b;
definito da qualche parte. Per concatenarli in a struct C
tu lo fai:
struct A a;
struct B b;
struct C{
struct A a;
struct B b;
};
struct C c;
c.a = a;
c.b = b;
Nessun puntatore o memcpy
necessario.
Modifica: dal a
e b
sono dello stesso tipo, puoi in qualche modo accorciarlo a questo:
struct Something a, b;
struct C{
struct Something[2];
};
struct C c;
c[0] = a;
c[1] = b;
In C ++ si farebbe qualcosa del genere:
using C = std::array<Something, 2>;
C c{a, b};
1 per risposta № 2
Basta usare un array.
assumendo struct A
è definito un array sullo stack
struct A a1 = {...}; /* some initialisation here */
struct A a2 = {...}; /* more initialisation here */
struct A a[2];
a[0] = a1;
a[1] = a2;
o assegnarlo dinamicamente:
struct A * pa = malloc(2 * sizeof *pa);
if (NULL != pa)
{
pa[0] = a1;
pa[1] = a2;
/* use pa */
free(pa);
}
else
{
/* handle malloc error */
}
0 per risposta № 3
Bene, per prima cosa, il tuo codice ha un bug:
memcpy(&C, &A, sizeof(A));
memcpy(&C + sizeof(A), &C, sizeof(B));
Probabilmente dovrebbe essere
memcpy(&C, &A, sizeof(A));
memcpy(&C + sizeof(A), &B, sizeof(B));
Stavi copiando C in C piuttosto che in B.
Secondo, se ti trovi mai a giocare coni puntatori come questo probabilmente hanno un problema di progettazione da qualche parte lungo le linee: se si vuole REALMENTE unire due strutture insieme, perché la struct C non contiene semplicemente entrambe le struct A e B?
Se davvero vuoi che la struct C non abbia niente botprimitivi, amico, basta fare il lavoro per assegnare ogni campo individualmente. È davvero tanto lavoro? Immagino che abbia senso generalizzarlo se ti aspetti che questi campi cambino molto. Ma questa sorta di "codice intelligente" è il tipo esatto di cose che ti morderanno nel culo in seguito.