Pointer auf globale statisch variablen



  • Hallo Leute,

    ich habe ein Object, welche welche ich je nach strategy eine andere list verweisen will:

    typedef struct stObject
    {
       char* pList;
    } stObject;
    

    StrategyA.h

    void apply_A(stObject* pHandle);
    

    ich habe eine StrategyA.c file mit einer globalen variable:

    static const char* strings[] = { "apple", "orange", "grape", "banana",  };
    
    void apply_A(stObject *pHandle)
    {
    pHandle->pList = strings;
    }
    

    und altenativ:

    StrategyB.h

    void apply_B(stObject* pHandle);
    

    ich habe eine StrategyB.c file mit einer globalen variable:

    static const char* strings[] = { "auto", "cycle", "plane"  };
    
    void apply_B(stObject *pHandle)
    {
    pHandle->pList = strings;
    }
    

    so nun die frage, ist das safe? ich möchte je nach strategy ein andere List auf meine pList verweißen, und da die listen in den modulen ja statisch sind, sind die pointer ja immer gültig bzw, persisten oder?



  • @SoIntMan Ja, ich denke das kann man so machen. Diese Strings werden eigentlich vom Linker in die .data oder .rodata Section übernommen und damit genau so in das Programm "eingebacken" wie z.B. der Maschinencode von apply_A und apply_B. Will heißen, die existieren so lange, wie das Programm läuft oder die dynamische Bibliothek mit den Funktionen und Globalen geladen ist.

    Allerdings auch nur wenn die nicht vom Linker verworfen werden, z.B. weil dein Programm nirgendwo apply_B aufruft und daher strings in strategyB.c von nichts referenziert wird. Dann landen "auto", "cycle", "plane" eventuell nicht in der Binary. Da du dann aber auch eh nicht an den Pointer herankommst, sollte das unproblematisch sein.



  • Dieser Beitrag wurde gelöscht!


  • @Finnegan sagte in Pointer auf globale statisch variablen:

    @SoIntMan Ja, ich denke das kann man so machen. Diese Strings werden eigentlich vom Linker in die .data oder .rodata Section übernommen und damit genau so in das Programm "eingebacken" wie z.B. der Maschinencode von apply_A und apply_B. Will heißen, die existieren so lange, wie das Programm läuft oder die dynamische Bibliothek mit den Funktionen und Globalen geladen ist.
    Allerdings auch nur wenn die nicht vom Linker verworfen werden, z.B. weil dein Programm nirgendwo apply_B aufruft und daher strings in strategyB.c von nichts referenziert wird. Dann landen "auto", "cycle", "plane" eventuell nicht in der Binary. Da du dann aber auch eh nicht an den Pointer herankommst, sollte das unproblematisch sein.

    Vielen Dank für deine Antwort das hilft mir schon sehr weiter. Ist also generell kein Stilbruch? wird das so auch angewandt?



  • @SoIntMan sagte in Pointer auf globale statisch variablen:

    Vielen Dank für deine Antwort das hilft mir schon sehr weiter. Ist also generell kein Stilbruch? wird das so auch angewandt?

    Ob das exakt in der Form sehr verbreitet ist, kann ich nicht genau sagen, aber ich habe durchaus schon einige Bibliotheken gesehen, die Member eines struct auf interne Strings setzen, z.B. wenn da irgendwelche Default-Werte gesetzt werden.

    Auch sehe ich hier persönlich keinen großen Unterschied zu Funktionen, die direkt einen internen String zurückgeben, nur dass das bei dir eben etwas verschachtelter ist:

    const char* library_a_get_version_string();
    const char* library_b_get_version_string();
    

    Sowas ist jedenfalls ziemlich verbreitet.

    Du solltest allerdings darauf achten, dass du das const sauber mitführst. pList sollte entweder auch ein const char* sein, oder du solltest eine Kopie zurückgeben.



  • @Finnegan sagte in Pointer auf globale statisch variablen:

    Du solltest allerdings darauf achten, dass du das const sauber mitführst. pList sollte entweder auch ein const char* sein, oder du solltest eine Kopie zurückgeben.

    ok danke das werde ich tun.. 😉


Anmelden zum Antworten