kl. frage zu ... pointer & speicher



  • hallo,

    hab mal eine kl. frage zu pointer & speicherallokation:

    ein beispiel sagt mehr, als 1000 worte 🙂

    char *gibMir(char *andererString) {
        //tut was mit andererString
        char *neuerString = (char *)malloc(sizeof(char)*neueLänge);
        return neuerString;
    }
    
    int main(void) {
        char *test;
        test = gibMir("asdf");
        .....
    }
    

    meine frage: is das eine legale zuweisung, oder nicht?
    eigentlich wird ja der neue speicher schon in "gibMir" reserviert und dann nur ein "pointer" zurückgegeben oder?
    beim nächsten aufruf der gibMir wird ja für *neuerString ein anderer bereich allokiert oder?

    danke im voraus!



  • Die Zuweisung ist soweit ok, auch wenn man in C den malloc-Rückgabewert nicht casten soll. Und sizeof(char) ist immer 1.

    Du musst natürlich den 2.ten Aufruf von Gibmir mit einem anderen Pointer (z.b. test2) machen, sonst ist der Speicher ja "verloren".
    Oder du gibst ihn vor dem zweiten Aufruf mit
    free(test);
    wieder frei.

    EDIT:
    Achso ja, ich glaube, du darfst nichts mit dem übergebenen String machen, er ist als const anzusehen, wenn er über "" erstellt wurde.



  • SeppSchrot schrieb:

    Die Zuweisung ist soweit ok, auch wenn man in C den malloc-Rückgabewert nicht casten soll. Und sizeof(char) ist immer 1.

    aha! warum NICHT casten? malloc liefert ja void* zurück. kannst du mir einen link diesbezügl. schicken, oder das näher erläutern? wär nett!

    Du musst natürlich den 2.ten Aufruf von Gibmir mit einem anderen Pointer (z.b. test2) machen, sonst ist der Speicher ja "verloren".

    ja, das ist klar...

    danke soweit!



  • übrigens: natürlich mag diese frage für den ein oder anderen etwas blöd geklungen haben, weil es eine reine "tryIt" frage ist. aber man kriegt leider nicht immer ein segfault, wenn man was falsch programmiert 😞 -> oder? (System: Linux)



  • hephaistos6 schrieb:

    SeppSchrot schrieb:

    Die Zuweisung ist soweit ok, auch wenn man in C den malloc-Rückgabewert nicht casten soll. Und sizeof(char) ist immer 1.

    aha! warum NICHT casten? malloc liefert ja void* zurück. kannst du mir einen link diesbezügl. schicken, oder das näher erläutern? wär nett!

    verwendest du einen c++ compiler?



  • nein, gcc



  • hephaistos6 schrieb:

    SeppSchrot schrieb:

    Die Zuweisung ist soweit ok, auch wenn man in C den malloc-Rückgabewert nicht casten soll. Und sizeof(char) ist immer 1.

    aha! warum NICHT casten? malloc liefert ja void* zurück. kannst du mir einen link diesbezügl. schicken, oder das näher erläutern? wär nett!

    Weil in C das casten unnötig ist.



  • @supertux: danke - wieder was gelernt!

    weil wir grad da dabei sind:

    typedef struct packageInfo { irgendwas...};
    

    eine gültige intialisierung muss schon so aussehen oder?

    packageInfo bla* = malloc(sizeof(packageInfo));
    

    und wenns zB eine Liste wäre, muss ich auch bei jedem neuen element

    bla->next = malloc(sizeof(packageInfo));
    

    aufrufen oder?
    danke wieder!
    ciao



  • hallo,

    kl. bump und eine neue frage diesbezügl.
    ich hab zB ein struct mit 10 char* drinnen.
    genügts, wenn ich am ende
    free(structpointer) aufrufe oder sollte ich das vorher schon mit jedem char *element auch machen?

    thx in advance!



  • hephaistos6 schrieb:

    ich hab zB ein struct mit 10 char* drinnen.
    genügts, wenn ich am ende
    free(structpointer) aufrufe oder sollte ich das vorher schon mit jedem char *element auch machen?

    Wenn die char*-Elemente auf mit malloc allozierten Speicher zeigen, müssen sie natürlich freigegeben werden.



  • ok, thx!


Anmelden zum Antworten