C++ Arrays: Felder auslesen die es nicht gibt.

i!i!i!i!i!i!i!i

Cadet 2nd Year
Registriert
Dez. 2008
Beiträge
23
Hallo,

Ich bin auf eine komische Sache gestoßen; mehr durch Zufall. Ich poste einfach mal den Code, der mir keinen Fehler im Compiler macht, sondern einfach ausgeführt wird:
Code:
int test[5];
for (int i=0; i<5; i++)
{
    test[i] = i;
	cout<<test[i]<<endl;
} 
cout<<"\n"<<test[9]<<endl;
cout<<test[10]<<endl;
cout<<test[11]<<endl;
cout<<test[12]<<endl;

Worums geht is klar; Ein Array 'test' mit fünf Feldern vom Typ Integer wird mit Werten belegt. Feld 0 erhält die 1, Feld 1 die 2 usw. bis Feld 5.
Gleichzeitig werden die Felder ausgegeben um zu beweisen, dass die Werte eingetragen wurden.
Danach werden aber Felder aufgerufen, die es nach der Definition von 'test' gar nicht gibt. Es wird kein Fehler angezeigt, sondern irgendwelche Zahlen.
Die Ausgabe des Programms ist nämlich folgende:
Code:
0
1
2
3
4

3498920
3487968
1759384949
114817492
Die ersten 5 Zeilen sind klar, aber kann mir jemand die restlichen erklären?

Ich versteh nämlich nicht, warum der Compiler da keinen Fehler ausgibt...

Edit: Ach ja habs in DevC++ und in MS Visual C++ probiert, bei beiden das gleiche Ergebnis...
 
wenn du ein array mit 5 elementen in c++, wie in deinem programm festlegst, dann sorgt der compiler dafür das zur laufzeit genügend speicher für die 5 elemente zur verfügung gestellt wird. eine überprüfung ob nun der zugriff auf das array innerhalb der grenzen ist, wird in c++ nicht abgefangen, der programmierer muss entsprechend selber dafür sorgen. eine überprüfung der grenzen - wie in anderen programmiersprachen - erfolgt nicht! das was du dann siehst ist der zufällige inhalt von arbeitsspeicher der unmittelbar nach deinem array folgt. das programm geht dabei so weit, diesen speicher als integer zu interpretieren. deswegen die "seltsamen" integer werte. Im übrigen ist das oftmals die Ursache für fehlerhafte Programme, d.h. es wird fälschlicherweise auf Daten im Speicher zugegriffen, die nicht dazu gehören. Fehlinterpretation haben die Folge, oder es wird Speicher fehlerhaft überschrieben und dann an anderer Stelle falsch ausgewertet.
 
Zuletzt bearbeitet:
Du greifst damit auf Adressen "hinter" dem Array zu. Das ist logischerweise außerhalb des Arrays.
An den Adressen könnte alles Mögliche stehen. In deinen Fall eben die zu sehenden Werte.

Der Compiler warnt deswegen nicht, weil für ihn nicht ersichtlich ist, ob der Zugriff noch innerhalb des Arrays ist, oder schon außerhalb. Er kennt die Größe des Arrays nicht.

Jeder Zugriff den das Programm auf das Arrays ausführt erfolgt in der Weise, dass ab der Startadresse des Arrays noch eine Anzahl Bytes dahinter gelesen wird.
Wenn du also auf test[3] zugreifst macht der COmpiler folgendes daraus:
Zu lesende Adresse = Startadresse von test + 3 * sizeof(int)
Wenn du nun auf test[11] zugreifst ist es eben Startadresse von test + 11 * sizeof(int)
 
Man kann also sagen, das ist ein Fehler in C++?

Wird in Java, C# oder PHP eine solche Überprüfung gemacht?

Eignet sich so etwas als Zufallsgenerator (Wenn man nicht in einem bestimmten Bereich arbeitet)?

Fragen über Fragen :D
 
i!i!i!i!i!i!i!i schrieb:
Man kann also sagen, das ist ein Fehler in C++?

Wird in Java, C# oder PHP eine solche Überprüfung gemacht?

Eignet sich so etwas als Zufallsgenerator (Wenn man nicht in einem bestimmten Bereich arbeitet)?

Fragen über Fragen :D

Ein Fehler ist das nicht, das ist mehr oder weniger so gewollt.
Java und C# prüfen das, PHP weiß ich nicht.
Als Zufallsgenerator eignet sich das, allerdings nur als Teil Deiner gesamten zufälligen Daten. SSH beispielsweise bezieht einen Teil seiner Zufallsdaten zur Schüsselgenerierung so.
 
Man kann also sagen, das ist ein Fehler in C++?
Soweit würde ich nicht gehen, dies zu behaupten. Für mich ist es eine Eigenart des C++, die andererseits auch ein gewisse Sicherheit hinsichtlich der Performance bedeutet.

Wird in Java, C# oder PHP eine solche Überprüfung gemacht?
In C# auf jedenfall, Java vermutlich und PHP da würde ich mal davon ausgehen.

Eignet sich so etwas als Zufallsgenerator (Wenn man nicht in einem bestimmten Bereich arbeitet)?
Für wirklich gute Zufallszahlen für den Einsatz in Kryptografischen Funktionalitäten auf keinen Fall. Alles andere liegt im Ermessen des Betrachters. Ich würde es aber prinzipiell vermeiden, weil es sehr fehleranfällig ist!
 
Hui, Danke für die schnellen Antworten!

Ja Zufallsgenerator merk ich grad ist nich der idealste...

Interessant, was man alles so rausfindet, nur weil man mal versehentlich beim Aufruf eines Arrays die falsche Nummer eingegeben hat ;)
 
für den zufallsgenerator würde ich einfach den rauscher der sonne nehmen :P (genauergesagt sonnenstrahlen). Alles was mit dem zufallsgenerater fest programmiert worden ist, ist berechenbar ;)
auf jeden fall meinte so mein mikroprozessoren Prof.
 
In der Theorie hat dein Prof. recht, aber in der Praxis gibt es dennoch Mittel und Wege Zufallszahlen vom Computer generieren zu lassen, die nicht mit vertretbaren Aufwand nachberechnet werden können. Das ist eine Vorraussetzung um starke Verschlüsselung zu erreichen.
 
Zurück
Oben