C unterstützt die direkte Zuweisung einer Struktur an eine andere Struktur des gleichen Typs: Alle Felder werden byteweise kopiert (memcpy). Dies ist praktisch für das schnelle Klonen einer Struktur, zum Beispiel:
struct Point { int x, y; }; struct Point p1 = {10, 20}; struct Point p2; p2 = p1; // Jetzt p2.x=10, p2.y=20
Besonderheiten:
"Was passiert, wenn die Struktur einen Zeiger auf dynamisch zugewiesenen Speicher enthält und Sie eine Struktur der anderen zuweisen?"
Viele glauben, dass der gesamte Inhalt kopiert wird, aber das ist nicht der Fall.
Antwort: Es wird nur der Wert des Zeigers (Adresse) kopiert, nicht die Daten an dieser Adresse. Beide Strukturobjekte zeigen auf denselben Speicher.
struct Data { int *arr; }; struct Data d1; d1.arr = malloc(10 * sizeof(int)); struct Data d2 = d1; // d2.arr == d1.arr
Wenn Sie d2.arr ändern, ändern Sie den Speicher, den d1.arr sieht.
Geschichte 1
Datenserialisierung: wir haben eine Struktur mit einem internen Zeigerpuffer (malloc) zugewiesen — nach der Kopie wiesen zwei verschiedene Objekte auf denselben Speicher, und beim Freigeben riefen beide free() auf. Ergebnis — double free und ein Absturz des Dienstes.
Geschichte 2
Beim Versuch, eine komplexe Struktur zu klonen, habe ich vergessen, eine tiefe Kopie der Zeigerfelder zu erstellen. Nach der Änderung der Kopie erwarteten wir Unabhängigkeit, änderten aber das Original (und umgekehrt), was zu Inkonsistenzen der Daten führte.
Geschichte 3
Wir hatten eine Struktur mit einem eingebetteten Zeiger auf eine Zeichenkette. Wir wiesen die Struktur zu und gaben eine der Zeichenketten frei, woraufhin die andere Struktur plötzlich "kaputt ging" (dangling pointer), das Programm begann sich unvorhersehbar zu verhalten.