Mit return ein Array zurückgeben



  • Hallo,
    ich versuche schon seit geraumer Zeit eine Funktion zu schreiben mit der man einen Teil einer Zeichenkette zurückgeben kann.
    Mein Problem hierbei ist die Zurückgabe des Ergebnisses.

    char* sub(char in_string[], int start, int length) {
        if (length == 0) length = sizeof(in_string) - start;
        char result[length];
        int n = 0;
        for (int i = start; i < start + length; i++) {
            result[n] = in_string[i];
            n++;
        }
        return result;
    }
    

    Wenn ich nun 'result' innerhalb der Funktion ausgeben lasse, dann erhalte ich das korrekte Ergebnis.
    Benutze ich die Funktion dann allerdings so wie hier:

    int main(int argc) {
        char test[] = "this is a little test";
        char *res;
        res = sub(test, 0, 5);
        printf(res);
        system("PAUSE");
        return 0;
    }
    

    bekomme ich nur wirre Zeichen zurück.
    Mein Frage lautet also, wie ich die Rückgabe des Ergebnisses formulieren muss, damit ich bei printf() auch das richtige Ergebnis angezeigt bekomme.



  • dein array "result" existiert nur lokal innerhalb der funktion "sub", also auf dem stack - der wieder ueberschrieben wird sobald du eine andere funktion aufrufst.



  • hellihjb schrieb:

    dein array "result" existiert nur lokal innerhalb der funktion "sub", also auf dem stack - der wieder ueberschrieben wird sobald du eine andere funktion aufrufst.

    Aaaach, ich Hirn!
    Danke dir 🙂
    hm... weiß jemand dafür vllt gerade eine Lösung?
    static kann ich ja nicht verwenden, weil result eine variable größe hat ...



  • Möglichkeit A: Du legst den Speicher auf dem Heap an (mit new) - Freigabe nicht vergessen.

    Möglichkeit B: Du verwendest std::string (oder std::vector).



  • CStoll schrieb:

    Möglichkeit A: Du legst den Speicher auf dem Heap an (mit new) - Freigabe nicht vergessen.

    Möglichkeit B: Du verwendest std::string (oder std::vector).

    Danke, hat gekplappt.
    Zum Thema freigeben, wäre das so in ordnung?

    char test[] = "this is a little test";
    char *res = sub(test, 10, 6);
    printf(res);
    delete res;
    


  • P!nguin schrieb:

    Zum Thema freigeben, wäre das so in ordnung?

    Wenn du new[] benutzt, musst du mit delete[] freigeben.



  • Nur ist hier keinerlei new im Spiel. Das delete muß hier weg.



  • Braunstein schrieb:

    Nur ist hier keinerlei new im Spiel. Das delete muß hier weg.

    Das steht wahrscheinlich in der Funktion.

    Aber dadurch wird auch gleich das Problem dieser Methode offensichtlich: Da nirgendwo ein 'new' zu sehen ist, kommt niemand auf die Idee, dass da 'delete' hin muss. Generell sollte sich derjenige Codeteil, der Speicher allokiert, auch um dessen Entsorgung kümmern, sonst gibt's Chaos.

    Daher wäre hier ein Standardcontainer sicher die bessere Wahl.



  • Konrad Rudolph schrieb:

    Generell sollte sich derjenige Codeteil, der Speicher allokiert, auch um dessen Entsorgung kümmern, sonst gibt's Chaos.

    Ach wie schön, manchmal erinnert zu werden, daß ich mich mit dem
    gesamten Speicherallozierungs- und Freigabegeraffel nicht mehr abgeben muß!
    🕶 :p



  • Javaner schrieb:

    Ach wie schön, manchmal erinnert zu werden, daß ich mich mit dem
    gesamten Speicherallozierungs- und Freigabegeraffel nicht mehr abgeben muß!
    🕶 :p

    Ja, genau, geht mir genauso. Aber ich programmiere nicht Java, sondern C++. Oder, um Stroustrup zu zitieren: "C++ is the best language for garbage collection principally because it creates less garbage."



  • Javaner schrieb:

    Konrad Rudolph schrieb:

    Generell sollte sich derjenige Codeteil, der Speicher allokiert, auch um dessen Entsorgung kümmern, sonst gibt's Chaos.

    Ach wie schön, manchmal erinnert zu werden, daß ich mich mit dem
    gesamten Speicherallozierungs- und Freigabegeraffel nicht mehr abgeben muß!
    🕶 :p

    Naja, nicht immer ist Unwissenheit ein Segen ...
    Wie schön, dass ich Speicher genauso wie andere Ressourcen (z.B. Filehandles) behandeln kann - und zwar mit so schönen Sachen wie RAII ... 😉 :p

    Gruß,

    Simon2.


Anmelden zum Antworten