MINT lernen

Arrays und Zeichenketten

Warum braucht das Wort „Lena“ im Speicher fünf Byte, obwohl es nur vier Buchstaben hat?

1

Viele Werte in einem Array

Ein Array speichert mehrere Werte desselben Typs direkt hintereinander im Speicher.

C · array.c
#include <stdio.h>

int main(void) {
    int werte[5] = {4, 8, 15, 16, 23};
    int n = sizeof(werte) / sizeof(werte[0]);   // 20 / 4 = 5
    int summe = 0;

    for (int i = 0; i < n; i++) {
        summe = summe + werte[i];
    }
    printf("Anzahl: %d, Summe: %d\n", n, summe);
    printf("erstes: %d, letztes: %d\n", werte[0], werte[n - 1]);
    return 0;
}
Konsole
$ gcc -Wall array.c -o array
$ ./array
Anzahl: 5, Summe: 66
erstes: 4, letztes: 23
  • Anlegen:int werte[5] = {…}; — Typ, Name, Anzahl der Elemente in eckigen Klammern.
  • Index:läuft von 0 bis n − 1: werte[0] ist das erste, werte[4] das letzte Element.
  • Feste Größe:ein Array kann nach dem Anlegen nicht wachsen — anders als eine Python-Liste.
  • Keine Grenzprüfung:werte[5] wird übersetzt und liefert irgendeinen Wert (undefiniertes Verhalten) — kein IndexError wie in Python.
  • Durchlaufen:for (int i = 0; i < n; i++) — Bedingung mit <, nicht mit <=.
  • Anzahl:sizeof(werte) / sizeof(werte[0]) = Byte des Arrays : Byte eines Elements, typisch 20 : 4 = 5.
  • Array-Name:werte steht für die Adresse des ersten Elements, also für &werte[0].
Merke

Array: typ name[n]; reserviert n Elemente hintereinander. Zugriff mit name[i] für i = 0 … n − 1 — C prüft die Grenzen nicht.

2

Zeichenketten mit Endezeichen

In C ist eine Zeichenkette ein char-Array, das mit dem Endezeichen '\0' abschließt.

C · name.c
#include <stdio.h>
#include <string.h>

int main(void) {
    char name[] = "Lena";           // 'L' 'e' 'n' 'a' '\0'
    char kopie[20];

    int laenge = strlen(name);      // zählt bis vor '\0'
    int bytes = sizeof(name);       // ganzes Array
    printf("%s: %d Zeichen, %d Byte\n", name, laenge, bytes);

    strcpy(kopie, name);            // kopie = name geht nicht
    if (strcmp(kopie, "Lena") == 0) {
        printf("%s ist gleich Lena\n", kopie);
    }
    return 0;
}
Konsole
$ ./name
Lena: 4 Zeichen, 5 Byte
Lena ist gleich Lena
  • Endezeichen:'\0' (Wert 0) markiert das Ende — "Lena" belegt deshalb 5 Byte.
  • Ausgabe:%s gibt Zeichen für Zeichen aus, bis '\0' kommt.
  • strlen(s):zählt die Zeichen ohne '\0' → 4.
  • strcpy(ziel, quelle):kopiert samt '\0' — das Ziel muss groß genug sein.
  • Kein =:kopie = name; → error: assignment to expression with array type.
  • strcmp(s, t):liefert 0 bei Gleichheit, sonst negativ/positiv (s steht alphabetisch vor/nach t). == vergliche nur Adressen.
  • string.h:alle str…-Funktionen brauchen #include <string.h>.

Wähle oben ein Wort und rolle die Zeichenkette auf die Speicherzellen ab: Rolle nach rechts ziehen, Abrollen ▸ drücken oder die Rolle fokussieren und Pfeiltasten benutzen. Klicke danach eine Zelle an. Vergleiche am Ende die beiden Maßpfeile.

Zeichenkette abrollen

Halte fest: Hinter dem letzten Zeichen steht immer das Endezeichen '\0' (ASCII 0). strlen zählt nur die Zeichen davor, sizeof misst das ganze Array — deshalb ist sizeof bei char name[] = "…" immer um 1 größer. Fehlt der Platz für '\0', weiß niemand, wo die Zeichenkette endet.

Merke

Zeichenkette: char s[] = "Text"; belegt Anzahl Zeichen + 1 Byte für '\0'. Länge mit strlen, kopieren mit strcpy, vergleichen mit strcmp(s, t) == 0.

3

Allgemeine Hinweise

Platz für '\0' einplanen

char s[4] = "Lena"; übersetzt ohne Fehler, aber ohne Endezeichen — %s und strlen lesen dann über das Array hinaus.

Schleifengrenze mit <

Mit i <= n greift die letzte Runde auf werte[n] zu — außerhalb des Arrays, ohne Fehlermeldung.

Einfache oder doppelte Anführungszeichen

'A' ist ein einzelnes char (1 Byte), "A" eine Zeichenkette aus 'A' und '\0' (2 Byte).

Videos