C hatte und hatte nie einen nativen String-Typ. Per Konvention verwendet die Sprache Arrays von char
, die mit einem Null-Zeichen enden, d. H. Mit '\0'
. Funktionen und Makros in den Standardbibliotheken der Sprache bieten Unterstützung für die nullterminierten Zeichenarrays, z. B. strlen, iteriert über ein Array von char
, bis es auf '\0'
Zeichen und strcpy Kopien von der Quellzeichenfolge trifft, bis es auf '\0'
trifft.
Die Verwendung von Null-terminierten Strings in C spiegelt die Tatsache wider, dass C nur etwas mehr als die Assemblersprache sein sollte. Nullterminierte Strings wurden zu diesem Zeitpunkt bereits direkt in assembly language for the PDP-10 and PDP-11 unterstützt.
Es ist erwähnenswert, dass diese Eigenschaft von C-Strings zu einigen unangenehmen Buffer-Overrun-Fehlern führt, einschließlich schwerwiegender Sicherheitsmängel. Wenn Sie beispielsweise vergessen, eine Zeichenkette, die als Quellargument an strcpy
übergeben wurde, auf Null zu setzen, kopiert die Funktion sequenzielle Bytes von dem, was sich im Speicher befindet, nach dem Ende der Quellzeichenfolge, bis sie zufällig auf 0
trifft. möglicherweise überschreibt jede wertvolle Information den Speicherort der Zielzeichenfolge im Speicher.
In Ihrem Codebeispiel wurde das Zeichenfolgenliteral "Hello, world!" wird in ein 14 Byte langes Array von char
kompiliert. Die ersten 13 Bytes enthalten die Buchstaben, das Komma, das Leerzeichen und das Ausrufezeichen. Das letzte Byte enthält das Null-Beendigungszeichen '\0'
, das vom Compiler automatisch für Sie hinzugefügt wird. Wenn Sie auf das letzte Element des Arrays zugreifen würden, würden Sie es gleich 0
finden. Z.B .:
const char foo[] = "Hello, world!";
assert(foo[12] == '!');
assert(foo[13] == '\0');
jedoch in Ihrem Beispiel ist message
nur 10 Byte lang. strcpy
wird alle 14 Bytes, einschließlich des Null-Terminators, in den Speicher schreiben, beginnend mit der Adresse message
. Die ersten 10 Bytes werden in den Speicher geschrieben, der auf dem Stack für message
zugewiesen ist, und die verbleibenden vier Bytes werden einfach an das Ende des Stapels geschrieben. Die Konsequenz des Schreibens dieser vier zusätzlichen Bytes auf den Stapel ist in diesem Fall schwer vorherzusagen (in diesem einfachen Beispiel könnte es nichts schaden), aber in echtem Code führt dies normalerweise zu fehlerhaften Daten oder Speicherzugriffsverletzungsfehlern.
C hat keine Zeichenfolgen. – sashoalm
Sie brauchen char Nachricht [14]; – acraig5075
Ihr strcpy wird übrigens Ihr Char-Array überlaufen. Sie benötigen mindestens ein Char-Array der Länge 14 (13 Zeichen + Nullterminator) – wich