C++-Programm funzt ned :(

  • C++

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    C++-Programm funzt ned :(

    Hallihallöchen!

    Also hier gleich mein Problemo:
    Folgender (C++)Code:

    C-Quellcode

    1. #include <iostream>
    2. using namespace std;
    3. int main(){
    4. int h = 5;
    5. int* f = &h;
    6. while (f > 0){
    7. f--;
    8. }
    9. //cout << f << *f << &f << endl;
    10. cout << f << endl;
    11. //cout << *f << endl;
    12. cout << &f << endl;
    13. cout << *f << endl;
    14. cin.get();
    15. return 0;
    16. }


    Kurz Zusammenfassung: Ich habe einen Pointer, den ich solange dekrementiere, bis er auf die Speicherzelle 0x0 zeigt. In Zeile #13 soll es mir der Reihe nach, erst die Addresse, auf die f zeigt, dann den Inhalt der Speicherzelle und zuguter letzt die Addresse des Pointers selbst. Leider spackt mir dese Programm immer in Zeile #13 ab. also hab ich die 3 Ausgaben mal "ausgelager". Und anscheinen verursacht die Zeile #15 das Problem. Das Dekrementieren geht, nur eben an der Stelle, wenn ich bei Speicherzelle 0 bin, kommt die Meldung "test.exe funktioniert nicht mehr. Weiter Informationen ...".

    Hat des was mit Zugriffsverletzungen zu tun, wovor mich z.B. VS schützt in dem es ne Exception wirft oder isses was anderes? Denn so wie ich des verstanden habe, muss ja in jeder Zelle irgendein Wert sein, und wenns nur n zufällger Wert is.

    Lg Radinator :D
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Du setzt die Addresse des Pointers auf 0x00000000, das heißt der Zeiger zeigt auf diese Addresse.
    Wenn du ihn nun dereferenzierst(*) greifst du ja auf den Wert an der Addresse zu, du hast aber keine Rechte auf diese Addresse einfach so zuzugreifen.
    Des is iwie doch doof, ich will doch nur lese...wenn ich schreiben wollte und ich des ned dar, des würd ich ich ja noch verstehen
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Das Betriebssystem verhindert, dass du soetwas machen kannst, wir befinden uns schließlich im UserMode und nicht im KernelMode. Das OS implementiert Paging(o.ä.) damit dein Programm speicher allozieren kann, aber du hast auch entsprechend nur Zugriff auf diesen Speicher, wenn du weißt wo dein Programm steht könntest du z.B. tatsächlich den Programmcode(Maschienensprache halt) auf diese Art auslesen.

    Aber warum?
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    Das Betriebssystem verhindert
    Das ist eigentlich eher die CPU.

    Normalerweise braucht man solches Pointer-Gewürge nicht. Lies/Schreib da, wo dir Speicher zugeteilt wird und fertig.
    Mit freundlichen Grüßen,
    Thunderbolt