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.
-
supertux: falls du's noch nicht kennst: http://www.design-reuse.com/articles/14079/how-to-use-arm-s-data-abort-exception.html
-
+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."