Pointerarithmetik bei void-pointern



  • Tag,

    Ist folgender Codeausschnitt legal und portabel oder ist die Größe eines void-zeigers unterschiedlich auf verschiedenen Systemen ?

    short offset=10;
    void *ptr=memory; /*memory ist hier z.B. ein Parameter vom Typ unsigned char* */
    
    ptr+=offest;
    
    /* zugriff folgt*/
    

    Also mir ist schon klar das ich den entsprechenden Typ draufcasten muss wenn ich zum Beispiel den Zeiger auf eine Integervariable zeigen lasse.

    ptr+=(offset*size(int))
    /*oder*/
    ((int*)ptr)+=offset; /*geht das ueberhaupt ? */
    

    Ich möchte in meinem Fall aber nur byteweise incrementieren. Kann ich sicher gehen das ich immer offset bytes incrementiere wenn ich den ersten Code verwende, oder muss ich ein char drauf casten ? Wobei evtl. die Größe eines char auch nicht ein byte sein muss auf allen maschinen.

    Gibt es in C ein Byte-Äquivalent ?



  • prolog schrieb:

    Wobei evtl. die Größe eines char auch nicht ein byte sein muss auf allen maschinen.

    Doch. Ein char muss nur nicht 8 Bit breit sein.



  • Man kann Pointerarithmetik nur auf Zeiger auf vollständige Typen anwenden. void ist ein unvollständiger Typ.



  • Tag,

    Ok also komme ich nicht umhin den Pointer vorher (wenn auch nur temporär) zu casten um entsprechend zu erhöhen.?

    Wie kann ich also sicher gehen das der Pointer in jedem Fall nur byteweise erhöht wird ? Welchen Typ nehme ich da ?

    Daniel E. schrieb:

    prolog schrieb:

    Wobei evtl. die Größe eines char auch nicht ein byte sein muss auf allen maschinen.

    Doch. Ein char muss nur nicht 8 Bit breit sein.

    Sind 8 bit nicht 1 Byte ? Oder hab ich dich jetzt falsch verstanden ?



  • Welchen Typ nehme ich da ?

    char

    Sind 8 bit nicht 1 Byte ? Oder hab ich dich jetzt falsch verstanden ?

    ja, aber nicht im C++ Sinne

    btw. mach bitte keine leerzeichen vor Satzzeichen



  • Tag,

    Also char. Gut dann nehm ich das. 😃

    Es gibt einen C++ und einen anderen Sinn für Byte?



  • prolog schrieb:

    Es gibt einen C++ und einen anderen Sinn für Byte?

    eigentlich nicht. Ein Byte ist halt nicht immer acht Bit groß.
    8 Bit = 1 Oktet. Es hat sich bloß eingebürgert, von einem Oktet als Byte zu sprechen, da ein Byte meistens ein Oktet ist.
    Es kann aber auch eine andere Größe haben.



  • Tag,

    Ahh ich glaub jetzt hab ichs. Danke euch. 👍


Anmelden zum Antworten