Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Speicher und Adressen in C

Nach dieser Lektion: Ich kann sagen, wie groß eine Variable ist und wo sie im Speicher liegt.

Lektion, 55 Min.7 BefehleLab für Compilerbau und Rechnerarchitektur: gcc, flex, bison und RISC-V in einer VM

Wie viele Bytes belegt eine Variable?

Der Arbeitsspeicher eines Computers ist eine lange Reihe nummerierter Bytes. Jede Variable in C belegt einige davon, und die Nummer ihres ersten Bytes heißt Adresse.

Wer das versteht, weiß, warum ein int vier Bytes braucht und warum eine Struktur größer sein kann als die Summe ihrer Felder. Ein Fahrkartenautomat speichert jeden Preis in Cent als ganze Zahl, und genau das sehen wir uns an.

Am Ende dieser Lektion

Notiz

Ich kann sagen, wie groß eine Variable ist und wo sie im Speicher liegt.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Byteeine Speicherzelle aus acht Bit
Adressedie Nummer eines Bytes im Speicher
Datentyplegt fest, wie viele Bytes eine Variable belegtint
sizeofein Operator, der die Größe in Bytes liefertsizeof(int)
Strukturmehrere Felder unter einem Namenstruct
PolsterungFüllbytes, die der Compiler zwischen Felder legt

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Jeder Datentyp belegt eine feste Zahl von Bytes

Der Datentyp einer Variablen sagt dem Compiler, wie viele Bytes sie belegt. Ein char passt in ein Byte, ein int braucht vier.

Ein Byte hält nur 256 Werte. Größere Zahlen verteilt der Rechner auf mehrere Bytes, und das kleinste Stück steht zuerst. Die Tabelle gilt für ein 64-Bit-Linux wie das Lab.

Beispiel: die Größen der Grundtypen

TypBytesWofür er sich eignet
char1ein Zeichen oder eine kleine Zahl
int4eine ganze Zahl, zum Beispiel ein Preis in Cent
long8eine sehr große ganze Zahl
double8eine Zahl mit Nachkommastellen
Zeiger8die Adresse einer anderen Variablen

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Eine Zahl als Bytes im Modellspeicher

Code: python
# Modell: acht Bytes Speicher, alle auf 0
speicher = bytearray(8)
preis_cent = 1250
# Vier Bytes fuer eine Zahl, das kleinste Stueck steht zuerst
speicher[0:4] = preis_cent.to_bytes(4, "little")
print(list(speicher))
# Aendern Sie preis_cent auf 300 und fuehren Sie erneut aus.

Mit sizeof fragen Sie nach der Größe

Sie müssen Größen nicht auswendig kennen. Der Operator sizeof liefert sie in Bytes, und der Compiler setzt die Zahl für den Rechner ein, auf dem er läuft.

Das Programm unten gibt die Größen von vier Typen aus. Die Befehle darunter schreiben es in eine Datei, übersetzen es und starten es. Zuerst legen wir einen eigenen Ordner an.

Das Programm groessen.c

Code: c
#include <stdio.h>

int main(void) {
    printf("Bytes: char %zu, int %zu, long %zu, double %zu\n",
           sizeof(char), sizeof(int), sizeof(long), sizeof(double));
    return 0;
}

Einen Arbeitsordner anlegen

Befehl
mkdir -p ~/csys && cd ~/csys

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Das Programm in eine Datei schreiben

Befehl
printf '#include <stdio.h>\n\nint main(void) {\n    printf("Bytes: char %%zu, int %%zu, long %%zu, double %%zu\\n",\n           sizeof(char), sizeof(int), sizeof(long), sizeof(double));\n    return 0;\n}\n' > groessen.c

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Das Programm übersetzen

Befehl
gcc -o groessen groessen.c

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Das Programm starten

Befehl
./groessen

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Eine Struktur hat Füllbytes zwischen den Feldern

Eine Struktur fasst mehrere Felder zusammen. Der Prozessor liest schnell, wenn ein Feld an einer Adresse beginnt, die ein Vielfaches seiner Größe ist.

Deshalb legt der Compiler Füllbytes (Polsterung) dazwischen. Am Ende rundet er die Gesamtgröße auf ein Vielfaches des größten Feldes. Die Reihenfolge der Felder ändert also die Größe.

Beispiel: dieselben Felder in zwei Reihenfolgen

StrukturFeldBeginnt beiFüllbytes danach
KarteAltzone (char)03
KarteAltpreis_cent (int)40
KarteAltklasse (char)83
KarteNeupreis_cent (int)00
KarteNeuzone (char)40
KarteNeuklasse (char)52

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Das zweite Programm in eine Datei schreiben

Befehl
printf '#include <stdio.h>\n#include <stddef.h>\n\nstruct KarteAlt { char zone; int preis_cent; char klasse; };\nstruct KarteNeu { int preis_cent; char zone; char klasse; };\n\nint main(void) {\n    printf("Alt %%zu, Neu %%zu, Versatz von preis_cent in Alt %%zu\\n",\n           sizeof(struct KarteAlt), sizeof(struct KarteNeu), offsetof(struct KarteAlt, preis_cent));\n    return 0;\n}\n' > karte.c

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Das zweite Programm übersetzen

Befehl
gcc -o karte karte.c

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Größen der Strukturen ausgeben

Befehl
./karte

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele glauben, die Größe einer Struktur sei die Summe ihrer Felder. Bei KarteAlt ergäbe das 6, sizeof liefert aber 12. Der Compiler fügt Füllbytes ein. Rechnen Sie die Größe nie selbst aus, sondern fragen Sie sizeof.

Über dieses Lab und seinen Quellcode: Lab für Compilerbau und Rechnerarchitektur: gcc, flex, bison und RISC-V in einer VM

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.