2016-08-28 3 views
-6

Ich habe versucht, diesen Code in C und erwarteten Laufzeitfehler auszuführen, aber tatsächlich lief es ohne Fehler. Kannst du mir den Grund dafür nennen?Char Array kann mehr als erwartet halten

Wie initialisierte ich die Größe des Arrays als 10, wie kann Code Zeichenfolge mit mehr als 10 Buchstaben drucken?

+2

Undefiniertes Verhalten. Zu Ihrer Information: in Ihrer 'str' ist genug Platz für __9__ Zeichen. – tkausl

+0

Mögliches Duplikat von [So lesen Sie die Zeichenfolge von der Tastatur mit C] (http://stackoverflow.com/questions/7709452/how-to-read-string-from-keyboard-using-c) –

+0

scanf fuction kann eine beliebige Länge lesen von String, also hat Ihr Code ein undefiniertes Verhalten. – linvoker

Antwort

0

Das ist eine gute Frage. Und die Antwort
ist, dass es dort ist in der Tat ein Speicherproblem
Die Zeichenfolge gelesen wird und von der Adresse des str
bis zur Länge der tatsächlichen gelesenen Zeichenfolge Anforderungen gespeichert,
und überschreitet den Ort, den Sie zugeordnet für es.

Jetzt kann es nicht sofort abstürzen werden oder sogar überhaupt für
kurze Programme, aber es ist sehr wahrscheinlich, dass, wenn Sie
das Programm erweitern und andere Variablen definieren, erscheint an dieser Stelle
ihnen überrannt, die Schaffung seltsam Bugs aller Art, und es kann auch
schließlich auch abstürzen.

Kurz gesagt, ist dies ein echter Fehler, aber es ist nicht ungewöhnlich,
Speicher Fehler wie diese zu haben, die auf den ersten haben keinen Einfluss, aber
erstelle Bugs oder das Programm abstürzen später.

+0

Darf ich fragen, warum die Leitung bricht? – Li357

+0

Ja, weil kurze Zeilen einfacher zu lesen sind. –

3

Sobald Sie von einem Array außerhalb seiner Grenzen lesen oder schreiben, rufen Sie undefiniertes Verhalten auf.

Wenn dies passiert, kann das Programm alles tun, was es will. Es ist sogar erlaubt, dir ein Geburtstagslied zu spielen, obwohl es nicht dein Geburtstag ist, oder Geld von deinem Bankkonto zu überweisen. Oder es kann zum Absturz kommen oder Dateien löschen oder einfach so tun, als ob nichts passiert ist.

In Ihrem Fall tat es letzteres, aber es ist in keiner Weise garantiert.

Um weitere Details zu diesem Phänomen zu erfahren, lesen Sie etwas über die Ausnutzung Pufferüberläufe, das ist ein großes Thema.

1

C führt keine Überprüfung der Grenzen auf dem Array durch. Dies kann zu einem Pufferüberlauf-Angriff auf Ihre ausführbare Datei führen.

Die gebundene Überprüfung sollte am Benutzerende durchgeführt werden, um einen Pufferüberlauf zu erreichen.

Statt in magischen Zahlen einzugeben, wenn die Eingabe von fgets in einem Array nehmen, immer den sizeof(array) - 1 Operator auf dem Array, dass nehmen viel, -1 für einen Raum für '\0' Charakter zu verlassen.

Verwandte Themen