Pointer an Funktion



  • Moin!

    Mal wieder ein Problem mit Pointern 😕

    Folgende Struktur ist gegeben:

    void foo(void* ptr)
    {
       *ptr = // irgendeine initialisierung
    
    }
    
    void bar(void* ptr)
    {
       foo(*ptr);
    }
    
    main:
    void *ptr = NULL;
    
    bar(ptr);
    

    Wo steckt der Fehler? Ich finde ihn einfach nicht. Es wird ständig gesagt "error: ‘void*’ is not a pointer-to-object type"! Bitte um Hilfe 😃
    Gruß Sdy



  • Liegt an "irgendeiner Initialisierung"... zeig die doch mal.



  • ich mache dort einen aufruf auf eine .so-Datei. In der Manpage steht, dass dlopen einen void*-zeiger zurück gibt: void *dlopen(const char *filename, int flag);
    Es hat ja vorher geklappt, bis ich hier auf die zeiger umgestiegen bin. Es muss an der Übergabe der zeiger und der Dereferenzierung dieser liegen. (Also gehe ich mal von aus).

    Ist sonst so alles richtig mit den Zeigern? hab ein testproghramm geschrieben, in dem die zeiger auf int-Werte zeigen, geht es. Nur mit void hat er so seine Probleme.



  • Probier mal das hier:

    #include <iostream>
    
    void foo(void** ptr);
    void bar(void** ptr);
    
    int main(int argc, char** argv)
    {
        void* ptr = NULL;
    
        std::cout << "0x" << ptr << "\n";
        bar(&ptr);
        std::cout << "0x" << ptr << "\n";
    
        delete static_cast<int*>(ptr);
    
        return 0;
    }
    
    void foo(void** ptr)
    {
        // Irgendeine Initialisierung (inkl.
        // implizitem type cast zu void*):
        *ptr = new int(423);
    }
    
    void bar(void** ptr)
    {
       foo(ptr);
    }
    

    void -Zeiger dürfen nicht dereferenziert werden. Um einen übergebenen Zeiger aus einer Funktion/Methode heraus zu ändern, muss entweder eine Referenz oder ein Zeiger auf einen Zeiger zum Einsatz kommen.





  • okay, ich werde das mit den doppel-pointern machen!
    Aber mit referenzen auf void geht nicht! da meckert er auf alle fälle auch rum! hast du noch ein beispiel wie ich ne referenz auf nen void pointer mache?!



  • Ja, hier:

    #include <iostream>
    
    void foo(void*& ptr);
    void bar(void*& ptr);
    
    int main(int argc, char** argv)
    {
        void* ptr = NULL;
    
        std::cout << "0x" << ptr << "\n";
        bar(ptr);
        std::cout << "0x" << ptr << "\n";
    
        delete static_cast<int*>(ptr);
    
        return 0;
    }
    
    void foo(void*& ptr)
    {
        // Irgendeine Initialisierung (inkl.
        // implizitem type cast zu void*):
        ptr = new int(423);
    }
    
    void bar(void*& ptr)
    {
       foo(ptr);
    }
    

    Dem Aufruf von bar() darf dabei allerdings nicht mehr die Adresse von ptr übergeben werden, sondern ptr selbst wird zum Argument (d.h. statt bar(&ptr) jetzt bar(ptr) ).



  • ich nehme mal die referenzen, auch wenn es ziemlich bescheuert aussieht 😉

    aber passieren jedenfalls nicht so viele fehler wie mit den pointern!

    vielen dank 😃


Anmelden zum Antworten