return char[] als char*



  • hi!

    hoffe ich hab jetzt nicht einen thread in der suche überlesen, aber wie kann ich "legal" ein char[] als char* aus einer funktion zurückgeben?

    char *foo() {
        char xxx[];
         return xxx;
    }
    

    da sagt mir gcc mit (-ansi -Wall) allerdings:
    warning: function returns address of local variable

    danke im voraus!



  • lies genau durch: warning: function returns address of local variable

    Das Problem ist nämlich, dass char* foo die Adresse des char-Zeigers zurückliefert. char xxx[]; ist ein Variable, die nach Verlassen von der Funktion foo nicht mehr gültig ist, d.h. wenn due die Adresse zurückgibst, wo xxx im RAM sich befindet, leiferst du eine ungültige Adresse, weil sie nicht mehr initialsiert ist, denn beim Verlassen von foo die Variable xxx sozusagen zerstört wird.

    1. Lösung

    char* foo(char* src)
    {
        /* mach irgendetwas mit src */
        return src;
    }
    

    2. Lösung

    char* foo()
    {
        char* xxx;
        ...
        xxx = malloc(<größe des Strings>+1);
        /* mache etwas mit xxx */
        return xxx;
    }
    

    Mit der 2. Lösung muss man aber nicht vergessen, dass man den Speicher freigeben muss, d.h.

    char* x = foo();
    ...
    free(x);
    


  • hi pablo,

    aha!! das mit dem gültigkeitsbereich ist eine gute erklärung. thx!

    eigentlich bin ich immer nach der 2. lösung vorgegangen.
    was is deiner meinung nach die beste lösung?

    thx



  • hephaistos6 schrieb:

    was is deiner meinung nach die beste lösung?

    Der Aufrufer ist für den Speicher verantwortlich.
    siehe snprintf, strcpy,...



  • dh: wenn die aufgerufene funktion mehr speicher braucht, benutzt sie realloc oder?

    thx



  • hephaistos6 schrieb:

    was is deiner meinung nach die beste lösung?

    beide. Ich benutze beide, je nachdem was meine Funktion tun soll. Manchmal ist die 1. Möglichkeit besser, manchmal die 2, das hängt davon ab, was und wie deine Funktion die Arbeit erledigt. Das einzige worauf man aufpassen muss, ist dass man den Speicher freigibt und wenn man die 2. Möglichkeit benutzt, darauf aufzupassen.

    hephaistos6 schrieb:

    dh: wenn die aufgerufene funktion mehr speicher braucht, benutzt sie realloc oder?

    thx

    Wenn sie so programmiert ist, dass sie es tut, dann ja, am sonsten nicht,



  • Wenn man die 1. Lösung umsetzt, sollte man aber auch die Größe des Buffer übergeben.



  • TactX schrieb:

    Wenn man die 1. Lösung umsetzt, sollte man aber auch die Größe des Buffer übergeben.

    stimmt, das hab ich vergessen.

    char* foo(char* src, size_t len)
    {
        /* mach irgendetwas mit src */
        return src;
    }
    


  • hallo,

    schön langsam lichtet sich da was 🙂

    thx


Log in to reply