ProgrammierungC-Entwickler

Wie wird die Arbeit mit Strings in C umgesetzt? Erklären Sie den Unterschied zwischen einem Zeichenarray und einem Stringzeiger. Wie kann man Fehler im Umgang mit Strings vermeiden?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

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
  • Zeichenarray: Reserviert Speicher für jedes Element einschließlich des abschließenden Nullzeichens. Das Array kann verändert werden (sofern es nicht const ist).
  • Stringzeiger: Kann auf einen Stringliteral (der nicht verändert werden kann) oder auf einen reservierten Speicherbereich zeigen. Ein Stringliteral wird normalerweise im schreibgeschützten Segment abgelegt.

Um Fehler zu vermeiden:

  • Verwalten Sie den Speicher korrekt (verwenden Sie malloc, strcpy, überprüfen Sie die Puffergröße).
  • Verwenden Sie keine Stringliterale zur Veränderung von Strings.
  • Stellen Sie sicher, dass alle Strings mit \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'

Fangfrage

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.

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas


Geschichte Das Team verwechselte die Konzepte von Zeichenarray und Zeiger auf einen Literal. Eine Funktion nahm char *output = "default"; entgegen und führte dann strcpy(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 \0 hinzugefügt wurde. Eines Tages gab eine Funktion Müll in der Konsole aus und beschädigte die interne Speicherstruktur.