C Programmierung. Wie man eine Struktur tief kopiert?

8

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.

    
user69514 24.09.2009, 23:01
quelle

7 Antworten

20

Einfach:

%Vor%     
nos 24.09.2009 23:04
quelle
10

Sollte es nicht sein:

%Vor%     
Alek Davis 24.09.2009 23:07
quelle
2

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:

%Vor%

oder alternativ

%Vor%     
Patrick Schlüter 11.07.2012 14:36
quelle
0

Zuerst ist der richtige Code

%Vor%

zweitens, das wird die Werte asis kopieren, so dass es für all diese langen und zeitlichen Strukturen sicher ist, aber der char * name-Parameter, den Sie haben, wird auf den gleichen ursprünglichen Wert zeigen.

    
Amirshk 24.09.2009 23:07
quelle
0

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.

    
Ashwin 25.09.2009 01:02
quelle
0

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.

    
Siva 29.09.2009 10:51
quelle
0

in dieser Datei kopiere ich die Mitglieder von origine zu destination, zuerst nur mit Zuweisungen und strcpy, dann kopiere ich origine zu memres, benutze nur memcpy

%Vor%     
MarcoC79 22.05.2010 17:26
quelle

Tags und Links