Was ist Struct (C-Struktur)?

Mechanismus in C, der mehrere Werte unterschiedlichen Typs (Member) zusammenfasst und als einen Typ behandelt. Definiert wird sie etwa als struct sensor { int id; float value; };; die Member einer Variablen s werden mit s.id angesprochen, über einen Zeiger p auf die Struktur mit p->id. Die Member liegen in der Reihenfolge ihrer Deklaration im Speicher, doch wegen der Ausrichtung (Alignment) können Füllbytes (Padding) dazwischen liegen, sodass die Gesamtgröße die Summe der Membergrößen übersteigen kann.

Japanische Bezeichnung: 構造体

„Struct (C-Struktur)“ kommt in 2 Übungsfragen aus 1 Themen vor, z. B. Grundlagen der Programmiersprache C.

Fachgebiet: Grundlagen der Programmiersprache C

Definition und Verwendung

Nach der Definition struct point { int x; int y; }; lässt sich eine Variable mit struct point p = {1, 2}; anlegen, und die Member werden mit p.x und p.y angesprochen. Vergibt man mit typedef einen Alias wie typedef struct { … } Point;, kann man ohne struct einfach Point p; deklarieren. Strukturen lassen sich mit = als Ganzes zuweisen und als Argument oder Rückgabewert einer Funktion verwenden; große Strukturen übergibt man jedoch üblicherweise über einen Zeiger.

Anordnung im Speicher

Die Member werden in der Reihenfolge ihrer Deklaration ab der kleineren Adresse abgelegt. Vor einem Typ wie int, der an einer 4-Byte-Grenze ausgerichtet sein muss, werden Füllbytes (Padding) eingefügt, und auch die Gesamtgröße der Struktur wird auf ein Vielfaches des strengsten Alignments aufgerundet. Eine Struktur aus char, int und char in dieser Reihenfolge belegt daher in einer üblichen Umgebung mit 4-Byte-int 12 Byte; steht int zuerst, sind es nur 8 Byte.

Vorsicht in Embedded-Systemen und bei Kommunikation

Es ist üblich, die Anordnung der Peripherieregister mit einer Struktur abzubilden, doch Padding und die Reihenfolge von Bitfeldern dürfen je nach Implementierung verschieden sein; wer das nicht prüft, erhält verschobene Adressen. Behandelt man Kommunikationsdaten oder Dateiformate direkt als Speicherinhalt einer Struktur, gehen durch Unterschiede bei Padding und Endianness die Kompatibilität zu anderen Umgebungen verloren; daher setzt man solche Daten häufig Byte für Byte zusammen.

Häufige Fragen

Was ist der Unterschied zwischen einer Struktur und einem Array?

Ein Array reiht Elemente desselben Typs aneinander, und Elemente werden über einen Index ausgewählt. Eine Struktur fasst Member unterschiedlichen Typs zusammen, und Member werden über ihren Namen ausgewählt. Beides lässt sich kombinieren, etwa als Array von Strukturen oder als Struktur mit einem Array als Member.

Warum sollte man die Größe einer Struktur mit sizeof ermitteln?

Wie viel Padding zwischen den Membern und am Ende eingefügt wird, hängt von den Typgrößen und den Alignment-Regeln (ABI) ab; die Summe der Membergrößen ergibt daher nicht die richtige Größe. Wird Speicher für eine Struktur mit malloc reserviert oder eine Struktur in eine Datei geschrieben, ermittelt man die tatsächliche Größe mit sizeof(struct Name).

„Struct (C-Struktur)“ in den Erläuterungen

Fragen mit „Struct (C-Struktur)“ (2)

  1. char habe 1 Byte und int 4 Byte, und int werde wie in üblichen Umgebungen an Adressen ausgerichtet, die ein Vielfaches von 4 sind. Welche Ausgabe erzeugt der obige Code bei der Ausführung?
  2. Die Header-Datei sensor.h wurde wie oben geschrieben. Welchen Zweck haben die drei Zeilen #ifndef, #define und #endif?

Verwandte Begriffe

Ausrichtung und Auffüllung (Alignment und Padding) Array Bitfeld Dangling Pointer (hängender Zeiger) Dynamische Speicherreservierung Funktionszeiger Integer-Promotion Makro Präprozessor Pufferüberlauf (Buffer Overflow)

Zur Glossarübersicht