Programmerklärung

chcomuf

Grünschnabel
Fange gerade an mit C++ und übe anhand des Buches "Übungsbuch C/C++".
Hier ist folgendes Programm gegeben:

#include <stdio.h>

int main(void)
{
char string[80];
while (gets(string) != NULL)
puts(string);
return 0;
}

Also es wird ein String eingelesen und wieder ausgelesen (NULL = Stringende?), das ist klar. Aber was bewirkt die Zeile "char string[80]. Soweit ich mich eingelesen habe, entspricht dem ja: Datentyp Name[Anzahl der Elemente], also kann "string" insgesamt 80 Char beinhalten oder wie? Also so versteh ich das. Aber wenn ich mit der Zahl variiere, bspw. 5 und >5 Chars eingebe, dann bekomme ich keinen Fehler?! Ist die Zeile also gar nicht nötig?
 
Also...
Gleich vorweg solltest mal wissen wie ein Array aufgebaut ist. Mehr oder weniger könnte man es so erklären, dass "string" ein Zeiger auf das erste Element der Zeichenkette ist. Die folgenden Elemente währen dann durch string[ i ] bzw auch *(string+i) zugänglich. *(string+i) dies erhöht die Speicheradresse jeweils um i Elemente, du musst dich nicht um die Bits und Bytes kümmern, da das normalerweise automatisch geschieht. Das heist, dass zB char array[5] im Hauptspeicher 5 aufeinanderfolgende Bits in Anspruch nimmt.

Nun zu deinem Beispiel.
Gehen wir davon aus, dass dein char Array 20 Zeichen lang ist. Nun liest du mit gets (nebenbei, das while könntest schmeisen ;) ) eine Zeichenkette ein. Angenommen 10 Byte. Im Speicher werden jetzt 10 Bits mit diesen Zeichen belegt sein, das 11. normalerweise mit '\0' und die restlichen mit irgendwelchem Schotter der nicht stört.

Nun zu deiner Frage wie es mit string[5] aussähe.
Wie schon gesagt, wird wieder Speicher reserviert, in diesem Fall 5 Byte. Wenn du nun eine Zeichenkette mit sagen wir 10 Byte einliest, kann das nicht gut gehen, meinst du nicht auch? Die ersten 5 der 10 eingelesenen Byte werden in den reservierten Speicherbereich geschrieben, die restlichen 5 einfach dahinter angehängt. Nun, in 90% der Fälle wird das keine Auswirkungen haben, aber es könnte zu Datenverlust oder aber auch zu einem Programmabsturz führen. Der Absturz kommt dann zustande, wenn du den "bewilligten" Speicherbereich deines Prozesses überschreiten willst und an den Speicherbereich eines anderen Prozesses kommst.

Diese Möglichkeit, mit zu langen Eingaben den reservierten Speicherbereich zu überschreiten nutzen Hacker schamlos aus, nur mal als Anmerkung. ;)


Hoffe das hilft dir weiter :D
lg Masda
 
Zurück