Zeiger inkrementieren



  • fehlerfuchs schrieb:

    richtig wäre, pc zeigt auf undefinierten speicherbereich mit undefiniertem inhalt.

    was meinst du da mit "undefinierten speicherbereich"? Die Adresse und Blockgröße ist ja bekannt.

    edit: uupps, fricky war ein paar Minuten schneller als ich.



  • Eclipse++ schrieb:

    Vielen Dank !
    undefinierter Speicherbereich bedeutet das es noch nicht festgelegt ist wie gross der Bereich ist?

    ja, den bereich hat ja keine variable reserviert. wie +fricky schon schrieb, die adresse ist bekannt, aber nicht was dort steht. weder ein nächster char noch ein unbekannter char-wert.

    Eclipse++ schrieb:

    Ich dachte mit typ char ist der Bereich 8 Bit gross?

    das mag meistens der fall sein, muss aber nicht. das ist durch die konstante CHAR_BIT in limits.h festgelegt.

    🙂



  • Ein 👍 für euch alle! Es sprudelt vor Kompetenz 🙂 Danke!



  • fehlerfuchs schrieb:

    Eclipse++ schrieb:

    Vielen Dank !
    undefinierter Speicherbereich bedeutet das es noch nicht festgelegt ist wie gross der Bereich ist?

    ja, den bereich hat ja keine variable reserviert. wie +fricky schon schrieb, die adresse ist bekannt, aber nicht was dort steht. weder ein nächster char noch ein unbekannter char-wert.

    Ich muss nochmal nachfragen...
    Der Zeiger ist doch vom Typ char (8 Bit gross normalerweise), in dem Bereich steht ein 8 Bit Wert. Aber dieser 8 Bit Wert ist ein char. Richtig?



  • ja, ein undefinierter, zufälliger wert vom typ char steht da drin.



  • fehlerfuchs schrieb:

    ja, ein undefinierter, zufälliger wert vom typ char steht da drin.

    sagen wir mal: wir greifen als 'char' darauf zu. was sich wirklich dort befindet, wissen wir nicht.
    🙂



  • +fricky schrieb:

    sagen wir mal: wir greifen als 'char' darauf zu. was sich wirklich dort befindet, wissen wir nicht.
    🙂

    jo, was dort ist wissen wir nicht.
    das kann man sich auch so hinbiegen: es steht eine zufällige 1/0 kombination drin. diese kombination lässt sich in jedem fall als ein char interpretieren. hi-hi.

    im prinzip ist es ja so:
    - der speicherplatz ist nicht definiert ( von keiner anderen variable reserviert ).
    - darum ist auch der wert undefiniert.
    - dank der fehlertoleranz/ignoranz 😃 von c wird dennoch eine adresse in pc nach dessen inkrementierung geschrieben.
    - der compiler stolpert dann über *pc, guckt nach und: ahaaaa, da ist ein char zu interpretieren und schwupp-kopiert nen zufallschrottwert in *pc rein. 🙂



  • ^^oder: an der adresse befindet sich überhaupt kein speicher und die cpu löst eine exception aus, z.b. den gefürchteten 'data abort' bei ARM prozessoren.
    🙂



  • da hamwa den salat! 🙂



  • +fricky schrieb:

    ^^oder: an der adresse befindet sich überhaupt kein speicher und die cpu löst eine exception aus, z.b. den gefürchteten 'data abort' bei ARM prozessoren.
    🙂

    die hab ich so oft gesehen 😉



  • So tief bin ich noch nicht in die Bitwelt eingetaucht. Ihr seid super!



  • supertux schrieb:

    +fricky schrieb:

    ^^oder: an der adresse befindet sich überhaupt kein speicher und die cpu löst eine exception aus, z.b. den gefürchteten 'data abort' bei ARM prozessoren.
    🙂

    die hab ich so oft gesehen

    die kann sogar nützlich sein. ich hab' sie mal benutzt, um eine speichererweiterung zu implementieren. 1MB unbenutzter adressraum wird im exception-handler auf einen seriellen RAM-baustein gemappt. ist zwar um ein vielfaches langsamer, als zugriffe auf internes RAM, aber für den code völlig transparent.
    🙂



  • +fricky schrieb:

    supertux schrieb:

    +fricky schrieb:

    ^^oder: an der adresse befindet sich überhaupt kein speicher und die cpu löst eine exception aus, z.b. den gefürchteten 'data abort' bei ARM prozessoren.
    🙂

    die hab ich so oft gesehen

    die kann sogar nützlich sein. ich hab' sie mal benutzt, um eine speichererweiterung zu implementieren. 1MB unbenutzter adressraum wird im exception-handler auf einen seriellen RAM-baustein gemappt. ist zwar um ein vielfaches langsamer, als zugriffe auf internes RAM, aber für den code völlig transparent.
    🙂

    ich weiß, es kann sehr nützlich sein. Ich hatte einen fiessen Bug in meinem Context-Switch Code, den ich ich erst durch eine abort excepction entdeckt hatte. Ohne dieses abort wäre ich nie drauf gekommen. Ein anderes Mal habe ich den Stack-Pointer für eine Sondertask falsch berechnet und nach 2 Stunden Laufzeit *kraaach* data abort. Ohne diese Exception hätte ich diesen Bug nicht einmal vermutet.





  • +fricky schrieb:

    supertux: falls du's noch nicht kennst: http://www.design-reuse.com/articles/14079/how-to-use-arm-s-data-abort-exception.html
    🙂

    cool, kannte es gar nicht, das werde ich mir in Ruhe anschauen. Was mir jedenfalls sofort gefallen hat: "Computers are like Old Testament gods; lots of rules and no mercy."


Anmelden zum Antworten