Frage zu Arrays
-
Hallo,
ich habe folgendes Array gegeben:
int feld[] = {1,2,3,4,5}; cout << feld[5] << endl << endl; cout << feld[6] << endl << endl; cout << feld[7] << endl << endl;Wenn ich nun das Programm ausführen lasse, erscheinen komischerweise auf für die Feldnummer 6,7 und 8 irgendwelche beliebigen Werte. Wisst ihr wie sich die Werte zusammesetzen?
Bei Variablen die zwar deklariert wurden, aber nicht definiert wurden, wird ja der Wert des Speicherbereichs ausgegeben (oder so ähnlich:-)) Aber wie schaut es denn bei den oben stehenden Feldern aus? Da wird bei mir z.B.
664 oder 57 ausgegeben... Ich hätte eher erwartet, dass hier eine Fehlermeldung erscheint...
Danke!
Viele Grüße
-
Array-Zugriffe werden nicht geprüft, das heißt du erwischst dort die Werte, die jenseits deines Arrays im Speicher stehen. Was dort steht, kannst du nicht voraussehen (möglicherweise andere Variablen oder die Rücksprungadresse der Funktion), darum bezeichnet man sowas auch als "undefiniertes Verhalten".
-
Wenn du
std::array(bzw.std::tr1::arrayoderboost::array) benutzt, kannst du solche Fehler im Debug-Modus erkennen. Enorm praktisch, und Null Overhead im Release-Modus.
-
Kev schrieb:
...
Bei Variablen die zwar deklariert wurden, aber nicht definiert wurden, wird ja der Wert des Speicherbereichs ausgegeben (oder so ähnlich:-)Wann hast Du Dir denn Diesen Quatsch ausgedacht?
Raus soll kommen, das Du C++ nehmen nusst, am Besten Boost ...
Unglaublich!
-
Kev schrieb:
Bei Variablen die zwar deklariert wurden, aber nicht definiert wurden, wird ja der Wert des Speicherbereichs ausgegeben (oder so ähnlich:-))
Im Prinzip richtig.
Du meinst: Bei Variablen, die zwar definiert wurden, aber nicht initialisiert wurden, wird ja der Wert des Speicherbereichs ausgegeben. Ja, sowas habe ich schon erlebt. (Aber nicht alle Variablen sind so drauf.)Aber wie schaut es denn bei den oben stehenden Feldern aus? Da wird bei mir z.B.
Da zeigt er Dir den Speicherbreich hinter dem Feld an. Der Rechner bemerkt nicht, wenn Du da einen zu großen Feld-Index benutzt. Und da kann erstens irgendwas stehen, also wie uninitialisierter Speicher, und zweitens kann der Zugriff auch mal nicht klappen und der Rechner kann abstürzen oder Nasaldämonen beschwören.