kostenloser Webspace werbefrei: lima-city


Grundlegendes Pointer-Missverständnis

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    f*********s

    Irgendwo in einem C++ code habe ich folgendes gelesen:

    int sehrWichtig
    
    //...
    
    sehrWichtig = 10;
    *sehrWichtig = NULL


    hääää? Warum wird sehrWichtig auch 10 und anschliessend irgendwie aus NULL gesetzt?

    Kann mir da jemand helfen?

    Gruss
    funcartoons
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ein pointer auf Null ist sogesehen Gar nichts.
    Du kannst ja schlecht auf einen nicht vorhandenen Speicehrbereich zugreifen, nicht wahr?

    Außerdem.. so als Anmerkung: In deinem Code fehlen ein paar Semikolons.^^


    Was macht der Code denn in den Zwischenschritten? Weil in deinem Beispiel macht es eigentlich..öhm..keinen Sinn.^^
  4. Autor dieses Themas

    f*********s

    Naja eigentlich hab ich den Code aus dem Kopf schnell hingeschrieben.
    Mann jetzt find ich die Originalstelle nirgends mehr...:slant:

    Also versteh ich das richtig:

    Der Wert von sehrWichtig ist nach Ausführung des ganzen Codes NULL?

    Oder ist er jetz 10 und *sehrWichtig is was anderes?


    Gruss
    funcartoons
  5. benutzernaemelchen

    Kostenloser Webspace von benutzernaemelchen

    benutzernaemelchen hat kostenlosen Webspace.

    Ich hab\'s so verstanden:

    bei der Initialisierung: int sehrWichtig = 10;
    ist sehrWichtig 10 - klar!

    nach *sehrWichtig = NULL;

    ist sehrWichtig aber NULL^^. Da sehrWichtig jetzt ins Leere zeigt - NULL eben.

    korrigiert mich bitte, wenns falsch sein sollte ;)



    EDIT: Übrigens liefert mir mein DevCPP einen Fehler bei dem Code^^ Ich hab sowas in der Art auch noch nie wirklich gesehen - keine Ahung, ob das überhaupt geht^^

    Beitrag geändert: 1.1.2008 12:07:29 von benutzernaemelchen
  6. Autor dieses Themas

    f*********s

    Also den code aus dem ich das habe ist der HORROR!

    Jeder 2. Code ist mit Koreanischen Kommentaren gschmückt und er ist \"Spaghetti-Code\" mit goto und allen Schikanen. Da drauszukommen ist ein Wunder. Darum find ich auch die Stelle nicht mehr.

    Gut möglich dass es sowas nicht gibt.

    Es war mir nämlich irgendwie im Kopf, dass sehrWichtig nach dem Pointer auf NULL setzen wieder abgefragt wird, was natürlich nach euren Aussagen volkommener Blödsinn ist.

    Danke für die Antworten.

    Gruss
    funcartoons
  7. c*********c

    int sehrWichtig
    
    //...
    
    sehrWichtig = 10;
    *sehrWichtig = NULL


    Der Code kann/wird nicht funktionieren:
    Die Variable sehrWichtig ist ein Integer; da die Dereferenzierung (*-Operator) einen Pointer voraussetzt, verhindert die Typsicherheit von C/C++ die Ausführung.
    Des Weiteren führt der willkürliche Schreibzugriff auf den Arbeitsspeicher i.d.R. zu einem Fehler (ansonsten war der Speicherbereich zufälligerweise der für das Programm reservierte ;))
  8. Jabb. man müsste das ganze int* Variablenname nennen. Dann wäre es ein Pointer auf einen Integerwert.

    Dann könnte man den pointer auch Nullsetzen...wenn man dann allerdings drauf zugreift wird ne Exception geworfen... =)
  9. Dann könnte man den pointer auch Nullsetzen...wenn man dann allerdings drauf zugreift wird ne Exception geworfen... =)

    Stimmt nicht, wenn man darauf zugreift stürzt das Programm ohne weitere Vorwarnung ab (\"Segmentation Fault\" bzw. \"Speicherzugriffsverletzung\") :P
  10. Mhhh...ich habe es gerade mal aus Jucks und Dollerei ausprobiert und muss sagen: Du hast recht.

    Selbst Try\'n Catch bringt iwie gar nichts.

    Oha, Nullpointer waren doch fieser als ich sie in Erinnerung hatte.
  11. p***********e

    Wieso funzt Try Catch nicht?
    Verabschiedet sich das Programm schon im try?
  12. Das Try\'n Catch Construct macht nichts anderes, als geworfene Exceptions abzufangen. Ein Programm, dass keine Exceptions wirft läuft demnach einfach weiter. Ein Fehler wie der segmentation Fault schießt das Programm aber ohne Umwege ab. Keine Exception kein gar nichts.
    Das Programm beendet sich (wahrscheinlich aus Sicherheitsgründen oder einfach weil der PC nicht mehr mitmacht ;D) ohne Umwege.
  13. Man kann natürlich den Pointer auf NULL testen, bevor man mit ihm arbeitet. So kann man Speicherzugriffsfehler verhindern und sich quasi selber Exceptions bauen.
  14. Autor dieses Themas

    f*********s

    Naja das heisst dass der Code nie verwendet wird denn abgestürzt ist es nie.

    (Ich bin immer noch ein grosser Fan von unendlichen For-schleifen. Einmal hab ich so eine gemacht:
    for(i=0;i>=0;i++)
    und dann ist mein PC so grauenhaft abgestürzt dass sämtliche offenen Programme vollkommen zerstört wurden und ich alles neu installieren musste. Naja hab eben nicht aufgepasst, so was kann passieren :D)
  15. sweetflake schrieb:
    Man kann natürlich den Pointer auf NULL testen, bevor man mit ihm arbeitet.

    Ist leider auch nciht der Weisheit letzter Schluss, da ein delete den Pointer leider nicht automatisch auf NULL setzt. Speicherzugriffsfehler gibt\'s immer dann, wenn das Programm versucht auf einen Speicherbereich zuzugreifen, von dem das Betriebssystem der Meinung ist, dass es das nicht darf. Muss nicht zwangsläufig NULL sein ;)
    Aber ich stimem dir zu, wenn man Pointer nach dem delete()en immer geflissentlich auf NULL setzt und auch immer brav darauf prüft, kann man sich zumindest einiges an Arbeit ersparen.


    und sich quasi selber Exceptions bauen.

    Eigene Exceptions baut man sich, indem man eine Klasse von der Standardklasse exception ableitet und diese dann irgendwohin wirft (mal bildlich gesprochen ^^). Prinzipiell kannst du aber jedes beliebige Objekt mit throw werfen und mit catch fangen, es muss nicht zwangsläufig von exception abgeleitet sein... die Ableitung ist aber trotzdem empfehlenswert.

    MfG,
    thw
  16. e********l

    (Ich bin immer noch ein grosser Fan von unendlichen For-schleifen. Einmal hab ich so eine gemacht:
    for(i=0;i>=0;i++)
    und dann ist mein PC so grauenhaft abgestürzt dass sämtliche offenen Programme vollkommen zerstört wurden und ich alles neu installieren musste. Naja hab eben nicht aufgepasst, so was kann passieren :D)

    Hast du schon mal was von While Schleifen gehört?

    while (true) {
    // TODO: Add smt here
    }

    Wesentlich eleganter ;)
  17. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!