In der Programmiersprache C werden Strings als Zeichenarrays implementiert, die mit einem Nullbyte ('\0') enden. Beispiel für die Deklaration eines Strings:
char str1[] = "hello"; // Array mit 6 Zeichen: {'h','e','l','l','o','\0'} char *str2 = "hello"; // Zeiger auf einen Stringliteral
const ist).Um Fehler zu vermeiden:
malloc, strcpy, überprüfen Sie die Puffergröße).\0 enden.Beispiel für den korrekten Umgang mit einem String:
char buffer[100]; strcpy(buffer, "test"); // OK, buffer ist modifizierbar und enthält garantiert '\0'
Was ist das Ergebnis der Ausführung des folgenden Codes und welche Fehler wird es verursachen?
char *str = "hello"; str[0] = 'H'; printf("%s\n", str);
Antwort: Das Programm führt zu unbestimmtem Verhalten, wahrscheinlich - zu einem Segfault, weil Stringliterale im nur-lesbaren Speicher abgelegt werden. Man darf keine Werte an die Adresse eines Stringliterals schreiben.
Geschichte Das Team verwechselte die Konzepte von Zeichenarray und Zeiger auf einen Literal. Eine Funktion nahm
char *output = "default";entgegen und führte dannstrcpy(output, input);aus, was beim ersten Ausführen zum Crashing führte, da das Kopieren in den schreibgeschützen Speicher erfolgte.
Geschichte Bei der Arbeit mit dem Netzwerk wurde das Ergebnis in einen Puffer geschrieben, der mit
char *buf = NULL; strcpy(buf, data);reserviert wurde. Dies führte zu einer Schreiboperation in nicht initialisierten Speicher und zum Absturz der Anwendung.
Geschichte Im Lokalisierungspaket übermittelte das Team Strings zwischen Komponenten, ohne sicherzustellen, dass das Zeichen
\0hinzugefügt wurde. Eines Tages gab eine Funktion Müll in der Konsole aus und beschädigte die interne Speicherstruktur.