Keine Adressen Fehler!!!



  • Hallo,

    ich benutzte den C++ Builder mit Win10. Wen ich den Code Schreibe

    bool bFound[4];
    
    bFound[5] = true;
    
    if (bFound[10])
    	ShowMessage("Lala");
    

    gibt er mir kein Adressen Fehler!

    und bei bFound[10] ist er sogar 'TRUE'

    woran kann das liegen

    MfG Rave



  • @Rave1703

    Das ist undefined behaviour, ein "Feature" von C/C++. Du provzierst undefiniertes Verhalten, da kann alles mögliche passieren.



  • @Rave1703 Die Zugriffsverletzung, die du vermutlich mit "Adressenfehler" meinst, gibt es normalerweise nicht, wenn du auf Speicher zugreifst, der in den virtuellen Adressraum des Programms (Prozesses) gemappt ist und auf den das Programm zugreifen darf - selbst wenn du den Speicher nicht - wie hier auf dem Stack - reserviert hast.

    Speicher wird üblicherweise über die Speicherverwaltung der Runtime in deinen Prozess gemappt. Diese stellt Funktionen wie malloc/free fur Verfügung auf denen letztendlich auch z.B. new/delete (und evtl. andere Mechanismen wie std::allocator) in C++ aufbauen. Auf Windows holt sich diese Speicherverwaltung z.B. Speicher vom Betriebssystems in größeren Blöcken (64KiB große "Speicherseiten") mit API-Funktionen wie VirtualAlloc. Dort findet dann das erwähnte "mapping" in den virtuellen Adressraum deines Prozesses statt. Greifst du auf irgendwelchen Speicher zu, den sich die Runtime zuvor mit VirtualAlloc geholt hat (z.B. um damit malloc/free-Allokationen bedienen zu können) wirst du im Allgemeinen keine Zugriffsverletzung sehen, wenn du keine speziellen Debuggung- oder Speicherschutz-Optionen aktiviert hast*.

    Praktisch greifst du in deinem konkreten Fall lediglich ein paar Bytes weiter auf den Stack zu, der schonmal ein paar Megabytes groß sein kann. Interessanterweise "wächst" der Stack bei x86-Systemen nach unten, d.h. das "oberste Element" hat die niedrigste Adresse. "Ein paar Bytes weiter" heisst hier konkret, dass du effektiv auf Daten zugreifst, die vorher auf dem Stack abgelegt wurden. Das können z.B. andere lokale Variablen sein, die vor bFound deklariert wurden, oder aber auch Daten wie die Rücksprungadresse aus der Funktion oder die übergebenen Funktionsparameter. Das gilt aber erstmal nur für die konkrete x86-Architektur, für die das Programm kompiliert wurde und auf der es ausgeführt wird. Auf anderen Systemen kann das komplett anders aussehen.

    Theoretisch ist das in C++ natürlich alles UB, wie @DocShoe bereits gesagt hat und sollte tunlichst vermieden werden, weil dann nicht mehr garantiert ist, dass dein Programm "korrekt" im Sinne des von dir geschriebenen C++-Codes läuft.

    Wenn du wirklich eine Schutzverletzung sehen willst, dann probier es mal deutlich "weiter weg" von bFound. Z.B. in einer Index-Schleife, die irgendwann auch mal außerhalb des Stacks und der Speicherseiten, in denen sich der Stack befindet, zugreift. Dann kommt die schon irgendwann 😁

    * Edit: Oder wenn die Speicherseite gegen deine Zugriffsart (lesen/schreiben/ausführen) geschützt ist. VirtualAlloc erlaubt auch, die Speicherseiten entsprechend zu markieren, was dann beim falschen Zugriff zu einer Schutzverletzung führen sollte.



  • Danke euch


Anmelden zum Antworten