[C]struct mit "="-Operator kopieren

Herakles

Profifragensteller
Moin!

Bislang habe ich structs immer mit memcpy dupliziert, bin aber zu meiner Verwunderung nun darauf gestoßen, dass das auch mit einem einfachen "="-Operator geht. Siehe http://www2.informatik.uni-halle.de/lehre/c/c_struct.html diesen Link. Hier mal ein Auszug davon:

Code:
struct person {
char name[20];
char vorname[20];
int alter;
} p1, p2;

struct person pp = { "Krause", "Anton", 44 };

printf("%s %s ist %d Jahre alt\n", pp.vorname, pp.name, pp.alter);

strcpy(p1.name, "Meier");
strcpy(p1.vorname, "Otto");
p1.alter = 77;

p2 = p1;
printf("%s %s ist %d Jahre alt\n", p2.vorname, p2.name, p2.alter);

Da wird also nicht nur ein struct, sondern innerhalb dieses structs auch zwei Arrays kopiert. Wie verlässlich funktioniert sowas? Kann man structs egal welcher Form wirklich einfach mit dem "="-Operator kopieren?

Danke für Eure Tipps und Anmerkungen,
Herakles
 
Das ist vollkommen valide und birgt keine Risiken.

Vorsicht ist geboten, wenn dein struct Pointer enthält. Denn dann werden nur Pointer rumkopiert. Da baut man schnell ein Memory-Leak.
 
Ja du kannst in C structs problemlos direkt zuweisen. Es hat allerdings nicht die selbe Semantik wie memcpy(dst, src, len) mit len gleich Größe von *dst und *src. Ein memcpy() Aufruf kopiert den Speicher 1:1 inklusive des Paddings wohingegen eine einfache Zuweisung den Inhalt der Struktur kopiert.
 
h^2: Mach dir um die Performance mal keine sorgen. Moderne C Compiler erkennen memcpy() als builtin und machen was sie fürs beste halten. Das muss kein Aufruf der memcpy() Funktion in der libc werden. Außerdem verbietet der C Standard dem Compiler auch nicht das Padding mit zu kopieren d.h. effektiv die Zuweisung als memcpy() Aufruf zu behandelt. Es erlaubt dem Compiler allerdings diese undefiniert zu lassen.
 
Die Zuweisung mit = sollte die performantere Variante sein, weil dann das Padding nicht mitkopiert werden muss. Der Compiler kann sich also aussuchen wie er es macht.

In C++ käme memcpy gar nicht in Frage.
 
Zurück
Oben