Pointer Frage



  • Hallo!

    Ich arbeite mit einer C-API die so aussieht:

    void fillColor(Color*);
    

    Der Funktion übergebe ich eine leer Color-Struktur welche dann gefüllt wird.

    Nur wenn ich jetzt einen Wrapper um diese Funktion schreibe

    Color* myWrapper() {
        Color* myColor = 0;
        void fillColor(myColor); // Call by Value
        return myColor; // 0?
    }
    

    Wird myColor doch nichts zu gewiesen.

    Wenn ich die Funktion jetzt so gestalten würde:

    Color* myWrapper() {
        Color myColor;
        void fillColor(&myColor); // Call by Reference
        return &myColor; // Undefiniertes Verhalten?
    }
    

    Wie könnte man das richtig lösen?

    Danke im voraus 🙂



  • Der Funktionsname "fillColor" impliziert das eine Color-Struktur gefüllt wird, und nicht erstellt. Erstellen würde auch keinen Sinn machen, da es keine Möglichkeit gibt den erstellten Zeiger irgendwie zurückzugeben (unpassender Returnvalue & kein passender Out-Parameter).

    Dein erstes Beispiel wäre demnach ungültig, denn du übergibst keine gültige Struktur sondern einen Null-Zeiger.

    Das zweite Beispiel würde funktionieren, wäre aber katastrophal. Du gibst einen Zeier auf eine lokale Variable zurück, die nach der Funktion gar nicht mehr existiert.

    Was hindert dich daran eine Struktur zurückzugeben, und keinen Zeiger auf eine Struktur? Einfach den Rückgabewert anpassen und den Addressoperator beim return entfernen im zweiten Beispiel.



  • Stimmt 😃

    Danke!



  • Color* myWrapper() {
        Color* myColor = 0;
        void fillColor(myColor); // Call by Value
        return myColor; // 0?
    }
    

    Funktioniert mit dyn. Speicherallokierung, welcher aber im umgebenden Kontext nach JEDEM Aufruf der Funktion wieder freigegeben werden muss.

    Color* myWrapper() {
        Color* myColor = malloc(sizeof(Color));
        void fillColor(myColor); // Call by Value
        return myColor; // 0?
    }
    
    Color* myWrapper() {
        Color myColor;
        void fillColor(&myColor); // Call by Reference
        return &myColor; // Undefiniertes Verhalten?
    }
    

    Würde mit programmglobalen Speicher funktionieren, allerdings wird dieser nur 1x allokiert, d.h. kann im Aufrufkontext nur mit einem Wert gleichzeitig verwendet werden, also z.B. nicht mit Threads.

    Color* myWrapper() {
        static Color myColor;
        void fillColor(&myColor); // Call by Reference
        return &myColor; // Undefiniertes Verhalten?
    }
    

Anmelden zum Antworten