ESP

Felder, Zeiger und Speicher

Arrays, Strings, Zeiger, Speichergrenzen, dynamische Speicherverwaltung und zusammengesetzte Datentypen.

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 Indizes 0 bis 9.

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:

OperatorBedeutung
&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 free nicht 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