Warum man sizeof
für Strings in C nicht verwenden sollte
In C kann die Verwendung von sizeof
bei Strings oft zu unerwarteten Ergebnissen führen. Hier sind die wichtigsten Gründe:
1. Pointer statt Stringgröße
Wenn ein String als Zeiger (char *
) definiert wird, gibt sizeof
die Größe des Zeigers zurück, nicht die Länge des Strings.
Beispiel:
Erklärung:
sizeof(str)
gibt die Größe des Zeigers (typischerweise 8 Byte auf einem 64-Bit-System) zurück, nicht die Anzahl der Zeichen im String.
2. Nullterminator wird mitgezählt
Wenn der String als Array definiert wird, gibt sizeof
die Größe des gesamten Arrays zurück, inklusive des Nullterminators (\0
), der das Ende eines Strings markiert.
Beispiel:
Erklärung:
sizeof(str)
liefert 6, da der String "hello"
aus 5 Zeichen besteht, aber der Nullterminator mitgezählt wird. Dies kann verwirrend sein, wenn man nur die Länge des sichtbaren Textes erwartet.
3. Funktioniert nicht mit dynamischem Speicher
Bei dynamisch allokierten Strings liefert sizeof
nur die Größe des Zeigers und nicht die tatsächlich reservierte Speichermenge oder die Länge des Strings.
Beispiel:
Erklärung:
sizeof(str)
gibt hier nur die Größe des Zeigers zurück (8 Byte auf einem 64-Bit-System). Um die Länge des Strings herauszufinden, muss man strlen
verwenden.
Richtiger Ansatz: strlen
Um die tatsächliche Länge eines Strings (ohne den Nullterminator) zu ermitteln, sollte die Funktion strlen
verwendet werden.
Beispiel:
Erklärung:
strlen(str)
zählt die Anzahl der Zeichen im String bis zum Nullterminator, ohne diesen mit einzubeziehen.
Zusammenfassung
sizeof
gibt bei Zeigern die Größe des Zeigers zurück, nicht die Länge des Strings.- Bei Arrays liefert
sizeof
die Größe des Arrays, inklusive Nullterminator. - Bei dynamisch allokierten Strings hilft
sizeof
nicht, um die Länge des Strings zu bestimmen.
Verwende immer strlen
, um die tatsächliche Anzahl der Zeichen in einem String zu ermitteln.