C Deep Copy - Struct Array - Wie am effizientesten kopieren?

hell-student

Lieutenant
Registriert
Nov. 2007
Beiträge
671
Hallo Zusammen,

Ich bräuchte mal wieder etwas hilfe. Leider kann ja memcpy nicht ein "deep copy" durchführen. Dies führt dazu, dass nur Membervariablen bzw. führt es nur eine Kopie von einem Bytestring aus und kopiert somit Pointer, statt das zu kopieren, worauf der Pointer zeigt.

Folgende Situation:

Code:
typedef struct mem_chunk_ {
	unsigned int addr; /* start address */
	unsigned int size; /* size of the chunk */
	unsigned int type; /* free = 0, blocked = 1 */
	struct mem_chunk_ *pred; /* predecessor */
	struct mem_chunk_ *succ; /* successor */
	struct mem_chunk_ *next_free;
	struct mem_chunk_ *next_cand;
	unsigned int si_id;
	unsigned int mol_id;
	unsigned int id;
} mem_chunk;

static mem_chunk cds_chunks[512];
static mem_chunk cds_chunks_copy[512];

Wie kann ich nun eine Kopie von cds_chunks ausführen? Ich habe ja ein Array von Structs.

Alle unsigned ints werden so wie sie sind kopiert, jedoch auch die Pointer -> In der Kopie zeigen die Pointer noch aufs Original. Wie kann ich dies am besten und effizientesten lösen?

thx
 
Eine Copy-Funktion schreiben, die erst nen byte-copy ausführt und dann die pointer auf null setzt (oder was auch immer du da gesetzt haben willst). dafür kannste ja einfach die korrespondierenden 16/32 Byte nullen (x86/x64). Nullen natürlich nur, wenn da nichts spezifisches reinsoll.
 
Also du könntest da ne Clone-Funktion für jeden Typ schreiben, das garantiert dir dann eine Deep-Copy, sofern du keine Schleifen im Code hast (da müsstest du dann die bereits kopierten Objekte speichern und bei jeder weiteren Kopie prüfen, ob du die nicht bereits kopiert hast).
Code:
typedef struct mem_chunk{
...
}mem_chunk;
mem_chunk mem_chunk_clone(const mem_chunk*m){
mem_chunk ret=*m;
ret.first_ptr=mem_chunk_clone(m.first_ptr);
...
return ret;
}
Für ein Array natürlich ein
Code:
mem_chunk*mem_chunk_clone_array(const mem_chunk*m,int len){
mem_chunk *ret=calloc(sizeof(mem_chunk),len),*r=ret;//Ist das die richtige Parameterreihenfolge?
while(len--)
//*ret++=*m++;//Falsch
*ret++=mem_chunk_clone(*m++);
return r;
}
Oder nehm C++ und ne Klasse^^.
 
nach meinem verständnis hast du am anfang ein array aus structs, wobei jedes struct pointer auf andere elemente dieses arrays hat. soweit korrekt?

dann willst du diese gesamte datenstruktur kopieren, sodass in der kopie die pointer auf die korrespondierenden kopien zeigen.

wieso verwendest du nicht indizes statt pointer?
 
Zuletzt bearbeitet:
Folge den Zeigern in der Struktur und allokiere für jeden noch nicht angetroffenen Zeiger eine weitere Struktur und kopiere das Ziel des Zeigers in die neue Struktur.
Das rekursiv machen, bis alles kopiert ist. Zeiger, die du vorher schonmal gesehen hast dann auf die entsprechende Kopie vom ersten Antreffen setzen.

Hoffe, das ist nachvollziehbar formuliert :/
 

Ähnliche Themen

Antworten
18
Aufrufe
6.362
Zurück
Oben