Pointerarithmetik mit void Pointern?



  • Hi
    ich habe einen void Pointer der eine Adresse in einem Array enthält und einen Pointer auf den Anfang des Arrays.
    Jetzt möchte ich den Index des Elements, auf das der void Pointer zeigt herausbekommen und hab dazu versucht mit Pointerarithmetik ranzugehen, das heißt ich ziehe von dem void Pointer den Pointer auf den Anfang des Arrays ab (geht mit gcc auch, wenn beides void Pointer sind).
    Unter Windows meckert aber der Visual Studio Compiler, dass der void* eine unbekannte Größe hat.
    Wie kann ich so etwas bewerkstelligen und warum geht es mit dem einen Compiler und mit dem anderen nicht?
    BeispielCode:

    short array[100] = {0};
    void f(void* data)
    {
      void* start = (void*)array; // mit dieser Zeile macht es der gcc, aber vs macht es mit und ohne nicht
      int index = data - array;
    }
    


  • eigentlich müsste es so aussehen:

    short array[100] = {0};
    void f(void* data)
    {
      int index = (short*)data - array;
    }
    

    ich weiss allerdings nicht, warum der gcc mit void* rechnen kann. 'normale' compiler wollen davon nichts wissen und standardkonform ist es, meines wissens nach, auch nicht.
    🙂



  • das ist eine erweiterung des gcc gegenüber des standards:
    http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Pointer-Arith.html



  • gcc schrieb:

    das ist eine erweiterung des gcc gegenüber des standards:
    http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Pointer-Arith.html

    na, ob das so eine gute idee ist?
    damit unterstützt der gcc das schreiben von nicht-standardkonformem code.
    wozu soll das rechnen mit void* überhaupt gut sein, wenn es doch char* gibt?
    🙂


  • Mod

    badidea-freak schrieb:

    damit unterstützt der gcc das schreiben von nicht-standardkonformem code.

    Das haben Compilererweiterungen so an sich...
    Wird Wert auf konformen Code gelegt, kann man jederzeit -ansi benutzen und diese Erweiterung deaktivieren - oder man beschränkt sich auf eine Warnung per -Wpointer-arith. Man könnte höchtens bemängeln, dass diese Erweiterung standardmäßig aktiviert ist - aber dieses schlechte Benehmen wird auch von anderen Compilern geteilt.
    Zudem besteht diese Erweiterung wenigstens seit Version 2.95.3 - das legt nahe, dass dieses Feature aus historischen Gründen besteht (vielleicht um die Übernahme von Code, der void* nicht kennt, zu vereinfachen?).



  • camper schrieb:

    Man könnte höchtens bemängeln, dass diese Erweiterung standardmäßig aktiviert ist

    ja, und dass gerade anfänger auf sowas reinfallen und dadurch 'falsches C' lernen.

    camper schrieb:

    - aber dieses schlechte Benehmen wird auch von anderen Compilern geteilt.

    ...nur ist dabei der unterschied, dass erweiterungen bei anderen compilern meistens aus zusätzlichen schlüsselwörtern bestehen, denen der geübte C-coder sofort ansieht, dass sie nicht zum standard gehören. dagegen ist das verändern von dingen, die im standard fetsgelegt sind, doch eine ganze ecke mieser. vielleicht kommen die gcc-entwicker eines tages noch auf die idee, dass funktionen adressen von lokalen, nicht-statischen objekten zurückgeben dürfen, ohne dass sich das programm undefiniert verhält? wundern würde es mich nicht.

    camper schrieb:

    ...(vielleicht um die Übernahme von Code, der void* nicht kennt, zu vereinfachen?).

    naja, aber code, der void* nicht kennt, wird aus void*-arithmetik wohl kaum einen nutzen ziehen können.
    🙂


Anmelden zum Antworten