Pointer auf undefinierten Bereich...



  • D-U-D-E schrieb:

    Vor Schreibzugriffen auf Speicher, der mir nicht gehört.

    Wo ist in deinem Beispiel ein fehlerhafter Speicherzugriff?!

    cheers, Swordfish



  • Immer mit der Ruhe. Meine Frage war einfach, ob man dem Compiler sagen kann, daß an solchen Stellen ein Absturz kommen soll. Ein einfaches "nein" hätte es auch getan.



  • D-U-D-E schrieb:

    Immer mit der Ruhe. Meine Frage war einfach, ob man dem Compiler sagen kann, daß an solchen Stellen ein Absturz kommen soll.

    Nein, deine Frage war, wie man "abschalten" kann, dass ein anscheinend korrekter Code nicht mehr "funktioniert". Dass das Unverständnis hervorruft und Nachfragen bewirkt, sollte dich nicht wundern.



  • D-U-D-E schrieb:

    Immer mit der Ruhe. Meine Frage war einfach, ob man dem Compiler sagen kann, daß an solchen Stellen ein Absturz kommen soll. Ein einfaches "nein" hätte es auch getan.

    keiner greift dich an, aber du scheinst etwas mit dem Speicherzugriff nicht verstanden zu haben und wenn man jemanden helfen will, muss man manchmal (unangenehme) Fragen stellen, damit man weiß, was Sache ist. Laut deinen letzten Posts sehen wir, dass du da etwas verwirrt bist (z.b. vor Schreibzugriffe schützen, die es gar nicht gibt) und wollten herausfinden, was du genau meinst.



  • Mein Gedankengang war folgender: da solche Anweisungen undefiniertes Verhalten hervorrufen, muß das dann wahrscheinlich vom Compiler geregelt werden (was dann von Compiler zu Compiler variieren kann). Beim Compiler von Microsoft ist es nun so, daß du scheinbar eine Speicherstelle zugewiesen kriegst, allerdings bin ich mir nicht sicher, ob dieser Speicher im Laufe des Programms nicht einfach überschrieben wird. Deswegen würde ich solches "Verhalten" am liebsten "abstellen" und einen Absturz produzieren. Meine Frage war nun einfach, ob es so ein Flag gibt oder nicht.



  • D-U-D-E schrieb:

    da solche Anweisungen undefiniertes Verhalten hervorrufen

    bitte schreib doch mal klar und deutlich hin, welche anweisungen du meinst.
    der code, den du gepostet hast, ruft kein undefiniertes verhalten hervor.



  • suma dartson schrieb:

    D-U-D-E schrieb:

    da solche Anweisungen undefiniertes Verhalten hervorrufen

    bitte schreib doch mal klar und deutlich hin, welche anweisungen du meinst.
    der code, den du gepostet hast, ruft kein undefiniertes verhalten hervor.

    Willst du mir sagen, daß

    char *t = 0;
    
        if (!t)
            t = "test";
    

    standardkonform ist? Jetzt bin ich allerdings wirklich verwirrt.



  • D-U-D-E schrieb:

    Willst du mir sagen, daß

    char *t = 0;
    
        if (!t)
            t = "test";
    

    Das ist aus dem Grunde standardkonform, weil das Ergebnis von "test" ein Zeiger auf ein Zeichenliteral ist, welches die gesamte Programmlaufzeit überdauert.



  • D-U-D-E schrieb:

    Willst du mir sagen, daß

    char *t = 0;
    
        if (!t)
            t = "test";
    

    standardkonform ist? Jetzt bin ich allerdings wirklich verwirrt.

    Wo siehst du denn da ein Problem?

    t wird mit Null initialisert, und verweist am Ende auf das Stringliteral "test".



  • Also wird das Literal "test" in den Speicher gelegt und t darauf umgebogen, richtig?



  • Das hat zwar nichts mit biegen zu tun, aber ja: t wird mit NULL initialisert, und verweist am Ende auf das Stringliteral "test" . 😉

    cheers, Swordfish



  • Okay, soweit so gut 🙂 Aber wieso klappt das zum Beispiel nicht mit einem Integer?



  • D-U-D-E schrieb:

    Okay, soweit so gut 🙂 Aber wieso klappt das zum Beispiel nicht mit einem Integer?

    Was genau?

    int a = 0;
    a = 12;
    

    Klappt doch 🙂

    Nochmal zum Hintergrund: "test" ist ein Zeichenkettenliteral in ReadOnly-Speicher des Programms. Du weist hier dem Zeiger zunächst den Wert 0 und dann den Wert "Adresse des Literals" zu. Bei dem Integer-Beispiel weist Du dem Integer zunächst den Wert 0 und dann den Wert 12 zu.

    int *a = 0;
    *a = 12
    

    Das ist eine völlig andere Situation. Du weist hier dem Zeiger zunächst den Wert 0 zu und dann dem, worauf er zeigt den Wert 12. Das ist undefiniert. Es wäre aber auch undefiniert wenn der Zeiger nicht den Wert 0 hätte.



  • Okay, Frage erledigt 😉 Danke!


Anmelden zum Antworten