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.
    🙂


Anmelden zum Antworten