Precedente :: Successivo |
Autore |
Messaggio |
saetta Eroe in grazia degli dei
Registrato: 25/02/08 10:52 Messaggi: 129
|
Inviato: 02 Mar 2011 17:34 Oggetto: [C] memcpy, memmove, si o no? |
|
|
Salve, sto realizzando un programmino in c e, dovendo scrivere una funzione che effettui la copia esatta di una struct, ho cercato di capire se posso usare memmove o memcpy.
La struct che devo copiare contiene un puntatore ad un array di (altre) struct, ognuna delle quali contiene un puntatore ad una lista di (altre ancora) struct.
ovvero:
Struct S_t
{
arrayElement *array; /*ptr alla testa della lista*/
int size;
}
Struct arrayElement
{
char *stringa;
listElement *testaLista
}
Struct listElement
{
int k;
listElement *next;
}
Se volessi copiare la struct A, di tipo S_t, un una struct B (stesso tipo), cosa è possibile copiare "al volo" con memcpy o memmove, e cosa no?
se ad esempio faccio memmove(B, A, sizeof(struct S_t) ),
l'array B->array contiene in ogni elemento già tutte le stringhe (copiate) e i riferimenti alle liste (quindi tutta la struct A copiata esattamente)???
Non credo che la funzione arrivi a tanto e vorrei capire fin dove posso usare queste 2 funzioni e da dove invece devo copiare "manualmente".
Illuminatemi Dei dell' Olimpo!!!
|
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11559 Residenza: Tokelau
|
Inviato: 03 Mar 2011 12:16 Oggetto: |
|
|
quando copi un char pointer copi solo il puntatore e non la stringa ovviamente... come quando copi uno struct pointer copi solo il puntatore e non la struct.
in ogni caso una struct può essere copiata direttamente, se mi ricordo bene. |
|
Top |
|
|
freemind Supervisor sezione Programmazione
Registrato: 04/04/07 20:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 03 Mar 2011 14:03 Oggetto: |
|
|
SverX ha scritto: | quando copi un char pointer copi solo il puntatore e non la stringa ovviamente... come quando copi uno struct pointer copi solo il puntatore e non la struct.
in ogni caso una struct può essere copiata direttamente, se mi ricordo bene. |
Sì, hai ragione in tutto.
In C la copia di una struct avviene membro a membro quindi dopo un b=a; abbiamo che la struct b è identica ad a. |
|
Top |
|
|
saetta Eroe in grazia degli dei
Registrato: 25/02/08 10:52 Messaggi: 129
|
Inviato: 03 Mar 2011 16:52 Oggetto: |
|
|
Citazione: |
In C la copia di una struct avviene membro a membro quindi dopo un b=a; abbiamo che la struct b è identica ad a. |
se b e a sono struct e non puntatori a struct, giusto?
Inoltre, se i membri di a fossero puntatori, in b ho che gli stessi campi puntano a ciò che è puntato in a ma non ho una copia , solo un indirizzamento.
Quindi se poi modifico o cancello a e i suoi campi, b si trova con riferimenti inconsistenti...o no??? |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11559 Residenza: Tokelau
|
Inviato: 04 Mar 2011 11:14 Oggetto: |
|
|
sì, occhio, quando copi i puntatori stai facendo una copia di un riferimento. Come copiarsi una via e un numero civico dalle pagine gialle: hai una copia dell'indirizzo, non hai fatto un altro palazzo |
|
Top |
|
|
freemind Supervisor sezione Programmazione
Registrato: 04/04/07 20:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 04 Mar 2011 15:31 Oggetto: |
|
|
SverX ha scritto: | Come copiarsi una via e un numero civico dalle pagine gialle: hai una copia dell'indirizzo, non hai fatto un altro palazzo |
SverX, da dove l'hai tirata fuori questa similitudine? |
|
Top |
|
|
saetta Eroe in grazia degli dei
Registrato: 25/02/08 10:52 Messaggi: 129
|
Inviato: 06 Mar 2011 12:39 Oggetto: |
|
|
Bella similitudine invece!!!
Grazie! |
|
Top |
|
|
freemind Supervisor sezione Programmazione
Registrato: 04/04/07 20:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 07 Mar 2011 10:35 Oggetto: |
|
|
Assolutamente!
Solo che non so come abbia fatto a partorirla! |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11559 Residenza: Tokelau
|
Inviato: 07 Mar 2011 12:09 Oggetto: |
|
|
ahahahahaha... e che ne so, ne dico di minchiate... in quantità |
|
Top |
|
|
|