Das Verständnis des Unterschieds in der String-Initialisierung
in C: Mit und Ohne abschließende Terminatoren
Bei der Arbeit mit Strings in der C-Programmierung ist es entscheidend zu verstehen, wie die Initialisierung funktioniert. Eine häufige Frage, die unter Entwicklern aufkommt, ist der Unterschied zwischen der Initialisierung eines Zeichenarrays mit einem expliziten Abschlusszeichen und einem leeren String.
In diesem Blogbeitrag werden wir zwei spezifische Möglichkeiten zur Initialisierung von Strings in C untersuchen:
char str1[32] = "\0";
und
char str2[32] = "";
Lassen Sie uns aufschlüsseln, was jede dieser Initialisierungen bedeutet und wie sie sich im Vergleich zueinander verhalten.
Erklärung der String-Initialisierung
Die Deklarationen
Beide dieser Deklarationen erstellen ein Zeichenarray mit einer Größe von 32. Sie enthalten jedoch unterschiedliche Anfangswerte.
-
char str1[32] = "\0";
- Hier wird das erste Element des Arrays auf ein Nullzeichen (
\0
) initialisiert. Dies setzt den String auf leer, lässt jedoch die restlichen Array-Elemente uninitialisiert (was bedeutet, dass sie möglicherweise zufällige Werte enthalten).
- Hier wird das erste Element des Arrays auf ein Nullzeichen (
-
char str2[32] = "";
- Dies initialisiert das erste Element ebenfalls auf ein Nullzeichen (
\0
), aber es initialisiert auch implizit die restlichen Array-Elemente auf\0
, da Sie es mit einem leeren String deklarieren.
- Dies initialisiert das erste Element ebenfalls auf ein Nullzeichen (
Praktisches Beispiel
Sie könnten denken, dass diese beiden Deklarationen aufgrund ihrer Größen gleichwertig sind, aber es gibt wichtige Unterschiede, wenn die Größen nicht angegeben sind.
Betrachten Sie den folgenden Code:
char a[] = "a\0";
char b[] = "a";
printf("%i %i\n", sizeof(a), sizeof(b));
Ausgabe:
3 2
Erklärung der Ausgabe
-
String
a
:- Dieser String enthält explizit das abschließende Nullzeichen, was zu einer Größe von
3
führt. Er enthält:- Das Zeichen
'a'
(1 Byte) - Den expliziten Nullterminator (
\0
) (1 Byte) - Den impliziten Nullterminator am Ende (1 Byte)
- Das Zeichen
- Dieser String enthält explizit das abschließende Nullzeichen, was zu einer Größe von
-
String
b
:- In diesem Fall enthält der String nur das Zeichen
'a'
und den impliziten Nullterminator, was ihm eine Größe von2
verleiht.
- In diesem Fall enthält der String nur das Zeichen
Wichtige Erkenntnisse
-
Initialisierung mit abschließenden Terminatoren:
Wenn Sie explizit einen abschließenden\0
einfügen, erhöhen Sie die Größe des Strings um ein Byte. Der C-Standard fügt automatisch einen weiteren\0
am Ende hinzu, was zu insgesamt zwei Nullterminatoren führt. -
Speicher und Allocation:
Das Verständnis dafür, wie C Speicher für Strings handhabt, kann Bugs und Fehler verhindern. Das Bewusstsein darüber, wie Strings initialisiert werden, kann erheblichen Einfluss darauf haben, wie Speicher in Ihren Anwendungen zugewiesen und abgerufen wird. -
Best Practices:
Initialisieren Sie Ihre Strings stets sorgfältig und berücksichtigen Sie, wie viele Zeichen und Terminatoren Sie einfügen möchten.
Mit diesem Wissen sollten Sie sich sicherer fühlen, die Feinheiten der String-Initialisierung in C zu navigieren. Viel Spaß beim Programmieren!