Ich habe die folgenden zwei Strukturen, in denen "child struct" eine "rusage struct" als Element hat.
Dann erstelle ich zwei Strukturen vom Typ "Kind", nennen wir sie childA und childB
Wie kopiere ich nur die Russe-Struktur von childA nach childB?
%Vor%Ich habe Folgendes getan, aber ich denke, es kopiert den Speicherort, denn wenn ich den Wert der Verwendung in childA geändert habe, ändert sich auch in childB.
%Vor%Ich weiß, das gibt childB alle Werte von childA. Ich habe bereits auf die anderen Felder in childB aufgepasst, ich muss nur in der Lage sein, die Russe-Struktur namens usage zu kopieren, die sich in der "child" -Struktur befindet.
EDIT: Ok, ich habe die Frage falsch gelesen, du wolltest nur das Verwendungsfeld kopieren; Also meine Antwort ist ein wenig unabhängig. Ich lösche es nicht, weil es Anfänger immer noch an das Problem des potentiellen Aliasing erinnern kann, wenn man eine Struktur mit Zeigern zuweist oder dupliziert.
Die memcpy
oder Zuweisung der anderen Antworten wird natürlich funktionieren. Die einzige Gefahr in Ihren Strukturen kommt vom Zeiger zum Namen. Wenn Sie eine Struktur in die andere kopieren, haben Sie beide Strukturen, die den Zeiger selbe enthalten und auf denselben Speicher verweisen. Sie haben einen Alias erstellt. Das heißt, wenn Sie den Namen im zugewiesenen Bereich ändern, wird er von der anderen Struktur aus sichtbar. Darüber hinaus besteht die Gefahr einer doppelten free
, wenn Sie Ihre Struktur an die Standard-Free-Funktion übergeben.
Um ein echtes Duplikat der Struktur zu erstellen, sollten Sie so etwas tun:
oder alternativ
%Vor%childB.usage = childA.usage
Da Sie die gesamte Struktur in der Kindstruktur haben, genügt einfaches Kopieren. Wenn Sie in der Kindstruktur einen Zeiger auf die Rausagestruktur hatten, könnte das ein Problem gewesen sein. In diesem Fall müssten Sie Speicher für childB.usage reservieren und dann einen memcpy-Befehl ausführen, damit childA nicht beschädigt wird, wenn jemand childA ändert / löscht.
Sie könnten zwei auf zwei Arten, wie andere bereits erwähnt haben.
1) childB.usage = childA.usage;
2) memcpy (& amp; childB.usage, & amp; childA.usage, sizeof (rusage));
Das erste Argument von memcpy ist das Ziel, das zweite Argument ist die Quelle und das dritte Argument ist die Länge (wie viele Bytes Sie kopieren möchten). Aus dem Code, den Sie gepostet haben, haben Sie versucht, das gesamte childB in childA zu kopieren, was Sie eigentlich nicht wollen.