Grundlagen der Programmiersprache C

struct S { char c; int i; char d; };
struct T { int i; char c; char d; };
printf("%zu %zu\n", sizeof(struct S), sizeof(struct T));

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?

  1. A6 6
  2. B9 6
  3. C12 8
Antwort und Erläuterung anzeigen

Antwort: C. 12 8

int wird so abgelegt, dass seine Adresse ein Vielfaches von 4 ist; in struct S folgen auf c daher 3 Füllbytes (Padding), i liegt ab Byte 4 und d bei Byte 8. Damit auch in einem Array solcher Strukturen das i jedes Elements ausgerichtet ist, wird zudem die Gesamtgröße auf ein Vielfaches von 4 aufgerundet: An die 9 Byte werden 3 Byte angehängt, was 12 Byte ergibt. In struct T folgen c und d auf i, was 6 Byte ergibt, aufgerundet 8 Byte. Ordnet man die Member vom größten Typ abwärts an, lässt sich das Padding verringern.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Grundlagen der Programmiersprache C

  1. uint32_t sei ein vorzeichenloser 32-Bit- und uint8_t ein vorzeichenloser 8-Bit-Ganzzahltyp, und die Umgebung sei Little-Endian. Welche Ausgabe erzeugt der obige Code bei der Ausführung?
  2. Welche Ausgabe erzeugt der obige Code, der 9 in ein 3-Bit-Bitfeld schreibt, bei der Ausführung?
  3. Welche Ausgabe erzeugt der obige Code, der das mit #define definierte Makro SQUARE verwendet, bei der Ausführung?
  4. Die Header-Datei sensor.h wurde wie oben geschrieben. Welchen Zweck haben die drei Zeilen #ifndef, #define und #endif?
  5. Der obige Code steht in der Funktion main. Welche Ausgabe erzeugt er bei der Ausführung?