Wenn Sie ein Array mit einer Klammer umschlossen Liste von Initialisierungen wie
char arr[] = {'A', '\b', 'B', '\b', 'C', '\b', '\b', '\n'};
es initialisieren ist keine explizite \0
am Ende des Arrays angehängt. So,
while(arr[index] != '\0')
läuft auf falschen Voraussetzungen und Zugriff außerhalb des gebundenen Speichers. Es ruft undefined behavior auf.
Zitiert C11
Kapitel §6.7.9
Wenn ein Array mit unbekannter Grße initialisiert wird, dessen Größe durch die größte bestimmt wird indexiert Element mit einer expliziten Initialisierer. Der Array-Typ wird am Ende seiner Initialisierungsliste abgeschlossen. wie in jenem Abschnitt erwähnte
Auf der anderen Seite, initialzing stellt ein Array mit einem Stringliteral automatisch den Null-Terminator am Ende
Ein Array von Zeichentyp initialisiert werden kann, durch eine Zeichenkette Literal oder UTF-8 String Literal, optional in geschweiften Klammern. Aufeinander folgende Bytes des Zeichenfolgenliterals (einschließlich , das Nullzeichen beendet, wenn Platz vorhanden ist oder wenn das Array eine unbekannte Größe hat) initialisieren die Elemente des Arrays.
Also, entweder
- fügen Sie ein
\0
als letztes Element der Initialisiererliste
- oder berechnen Sie die gültige Anzahl der Einträge selbst, wie
sizeof(arr)/sizeof(arr[0])
oder ähnliches verwendet wird.
Es besteht keine Notwendigkeit, durch "sizeof (char)" zu dividieren (ist immer 1) –
Besser zu verwenden 'sizeof arr/sizeof arr [0]' – chux