Zeiger inkrementieren
-
Ich habe hier meine Gedankengänge bei einer Zeiger Inkrementierung niedergeschrieben.
Kann jemand sich das anschauen und mir schreiben ob da Fehler habe?char c = 0; char *pc = &c; /* zeige auf c vom typ char ?! */ /* ---------- |00000000| char <- *pc zeigt auf char c mit dem Wert 0 ?! ---------- Adresse: 2244F1 */ *pc++; /* ---------- |00000000| char ---------- Adresse: 2244F1 |00011100| char <- *pc zeigt auf nächsten char mit irgeneinem wert !? ---------- Adresse: 2244F2 */ *pc++ = 1; /* ---------- |00000000| char ---------- Adresse: 2244F1 |00000001| char mit *pc++ = 1; wurde der Wert überschrieben, richtig?! ---------- Adresse: 2244F2 |01010010| char <-*pc zeigt auf nächsten char mit irgeneinem wert, richtig ?! ---------- Adresse: 2244F3 */
Ich hoffe ich konnte es übersichtlich präsentieren. Danke!
-
^^alles richtig
-
Danke +fricky
ps. ich hätte ein Fehler einbauen sollen
-
Eclipse++ schrieb:
Kann jemand sich das anschauen und mir schreiben ob da Fehler habe?
ja, ist ein fehler drin.
-
Sagst du mir den??
-
Eclipse++ schrieb:
/* |01010010| char <-*pc zeigt auf nächsten char mit irgeneinem wert, richtig ?! */
richtig wäre, pc zeigt auf undefinierten speicherbereich mit undefiniertem inhalt.
-
Vielen Dank !
undefinierter Speicherbereich bedeutet das es noch nicht festgelegt ist wie gross der Bereich ist?
Ich dachte mit typ char ist der Bereich 8 Bit gross?
-
richtig wäre, pc zeigt auf undefinierten speicherbereich mit undefiniertem inhalt.
der adresse ist wohl bekannt, nämlich eins mehr als vorher. nur der inhalt ist unbekannt.
-
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.