Felder, Zeiger und Speicher
Felder, Zeiger und Speicher
Felder, Zeiger und Speicherverwaltung gehören zu den wichtigsten Themen in C. Sie sind mächtig, aber auch eine häufige Quelle für Sicherheitsfehler.
Felder
Ein Feld speichert mehrere Werte desselben Typs direkt hintereinander im Speicher.
int zahlen[10];
Dieses Feld enthält zehn int-Werte.
Wichtig:
- Der erste Index ist
0. - Der letzte gültige Index ist
Anzahl - 1. - Bei
int zahlen[10]sind die gültigen Indizes0bis9.
Grenzen beachten
C prüft Array-Grenzen nicht automatisch.
int zahlen[10];
zahlen[10] = 5; // falsch: außerhalb des Feldes
Das kann Speicher überschreiben und zu Abstürzen oder Sicherheitslücken führen.
Strings
Strings sind in C Felder aus Zeichen.
char name[20] = "Anna";
C-Strings enden mit dem Nullzeichen '\0'. Dafür muss im Feld Platz bleiben.
Ein Feld mit 20 Zeichen kann also höchstens 19 sichtbare Zeichen speichern, wenn es als C-String verwendet wird.
Zeiger
Ein Zeiger speichert eine Adresse.
int zahl = 5;
int *ptr = &zahl;
Hier zeigt ptr auf die Variable zahl.
Wichtige Operatoren:
| Operator | Bedeutung |
|---|---|
& | Adresse einer Variable |
* | Wert an einer Adresse |
Zeiger sind nützlich, aber gefährlich, wenn sie uninitialisiert sind oder auf ungültigen Speicher zeigen.
Dynamische Speicherverwaltung
Bei dynamischer Speicherverwaltung wird Speicher zur Laufzeit reserviert und später wieder freigegeben.
Typische Funktionen:
malloc
calloc
realloc
free
Sicherheitsrelevante Regeln:
- Prüfen, ob Speicherreservierung erfolgreich war
- Speicher nur verwenden, solange er gültig ist
- reservierten Speicher wieder freigeben
- nach
freenicht weiter auf den Speicher zugreifen - Größe korrekt berechnen
Zusammengesetzte Datentypen
Die ergänzenden Unterlagen behandeln auch eigene und zusammengesetzte Datentypen.
struct
Mit struct werden mehrere Werte zu einem Datentyp zusammengefasst.
typedef struct {
int hunger;
int energy;
int happiness;
} Tamagotchi;
Das passt gut zu Programmen, die einen Zustand verwalten.
enum
Ein enum beschreibt eine feste Menge benannter Werte.
typedef enum {
STATUS_NEU,
STATUS_AKTIV,
STATUS_BEENDET
} Status;
Dadurch werden Zustände lesbarer als reine Zahlen.
union
Eine union speichert verschiedene Werte im selben Speicherbereich. Das ist platzsparend, aber fehleranfälliger und sollte bewusst eingesetzt werden.
const
const markiert Werte, die nicht verändert werden sollen.
const int maxVersuche = 3;
Das verbessert Lesbarkeit und verhindert unbeabsichtigte Änderungen.
Typische Sicherheitsprobleme
Bei Feldern, Zeigern und Speicher entstehen häufig:
- Buffer Overflows
- Speicherlecks
- Zugriff auf freigegebenen Speicher
- uninitialisierte Zeiger
- falsche Größenberechnungen
- fehlende Nullterminierung bei Strings
Merksatz
C gibt viel Kontrolle über Speicher. Sichere Programmierung bedeutet, diese Kontrolle diszipliniert zu nutzen.
Zuletzt aktualisiert: 6. Juni 2026