ProgrammierungBackend C Entwickler

Beschreiben Sie die Besonderheiten der Zuweisung von Strukturen in der Programmiersprache C. Wie werden Strukturen kopiert, welche Vorteile und Einschränkungen gibt es, welche Fehler können auftreten?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

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:

  • Alle Felder werden "as is" kopiert (bit für bit).
  • Wenn die Felder Zeiger/Arrays sind, wird nur der Zeiger selbst kopiert, nicht der Inhalt an dieser Adresse (tiefes Kopieren findet nicht statt!).
  • Die Zuweisung funktioniert nur für Strukturen des gleichen Typs.

Trickfrage

"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.

Beispiele für echte Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas


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.