Funktionen und Array Rückgabe



  • Hallo wie kann ich hier aus dem Array das Komplette Wort "Hallo" an das Hauptprogramm übergeben ?

    Warum bekomme ich nicht alles ausgeben ?

    [ Nein die Funktion func soll kein string var ="Hallo"; zurück geben.
    Ich will wissen wie das ganze mit einem Array funktioniert.
    Nein ich will auch keinen Vector benutzen. ^^ ]

    #include <iostream>
    using namespace std;
    
    char *func( );
    
    int main(int argc, char* argv[])
    {
    
    string str;
    char *sstr = "0";
    
    str = func();
    cout<< str .c_str() <<endl ;   //Gibt aus:  ~↕@
    
    sstr = func();   // Gibt aus:  Hall4
    cout<<sstr;
    
    system("PAUSE");
    }
    //---------------------------------------------------------------------------
    
    char *func ( )
    {
    char var[20] = "Hallo";
    
    return var;
    }
    


  • Überleg dir mal wann und wie lange das array var in der Funktion func existiert.



  • ja stimmt hatte ich auch schon im hintergedanken eigentlich ist das Array ja nach dem Verlassen der Funktion nicht mehr gültig.

    Aber warum funktioniert das hier dann ?

    #include <iostream>
    using namespace std;
    
    char *func( );
    
    int main(int argc, char* argv[])
    {
    char *str="0";
    
    str = func();
    
    cout<<str;
    
    system("PAUSE");
    }
    //---------------------------------------------------------------------------
    
    char *func ( )
    {
    char *var ="Hallo";
    
    return var;
    }
    

    Alternativ könnte ich es ja auch so machen:

    #include <iostream>
    using namespace std;
    
    char *func( );
    
    int main(int argc, char* argv[])
    {
    
    string str;
    char *sstr = "0";
    
    str = func();
    cout<< str .c_str() <<endl ;   //Gibt aus:  Hallo
    
    sstr = func();   // Gibt aus:  Hallo
    cout<<sstr;
    
    system("PAUSE");
    }
    //---------------------------------------------------------------------------
    
    char *func ( )
    {
    static char var[20] = "Hallo";
    
    return var;
    }
    

    Aber wie kann ich jetzt z.b. den Speicher wieder freigeben wenn ich eine static Variable verwende wird der Speicher erst dann wieder freigeben wenn das Programm beendet wird oder gibt es da noch eine andere möglichkeit?



  • nein gibt es nicht
    static heisst, es wird erzeugt und bis zum programm ende im speicher gehalten...



  • Gibt es suche nach new/delete new[]/delete[] oder verwende std::string für char-arrays.



  • HighLigerBiMBam schrieb:

    Gibt es suche nach new/delete new[]/delete[]

    Ganz schlechte Idee, wenn man noch wenig Ahnung hat. Die angebrachte Lösung ist hier eindeutig std::string .



  • Dass mit dem static qualifier qualifizierte array wird angelegt, sobald das erstemal die Funktion func durchlaufen wird und erst wieder zerstört beim Ende des Programms.

    Zeichenkettenliterale haben ebenfalls "static storage duration", also existieren ebenfalls solange, bis das Programm beendet wird. Diese Zeichenkettenliterale werden normalerweise im ROM gespeichert, daher sollte deine Deklarartion lauten:

    const char * var = "Hallo";
    

    Wie HighLigerBimBam schon sagte, kannst du natürlich alternativ das array auch auf dem Heap erstellen.



  • TyRoXx schrieb:

    HighLigerBiMBam schrieb:

    Gibt es suche nach new/delete new[]/delete[]

    Ganz schlechte Idee, wenn man noch wenig Ahnung hat. Die angebrachte Lösung ist hier eindeutig std::string .

    dito... Sicher haben Zeiger Nachteile aber deine Aussage ist hier falsch, es geht mit Zeigern.

    #include <iostream>
    #include <cstring>
    
    void foo(char *str)
    {
       strcpy (str, "copy successful");
    }
    
    int main()
    {
       char *str = new char[30];
       foo(str);
       std::cout << str;
       //delete[] str;
    }
    


  • aber ein static array mit delete zu bearbeiten ist eine schlechte idee

    ich glaube darauf wollte der threadersteller hinaus



  • Skym0sh0 schrieb:

    aber ein static array mit delete zu bearbeiten ist eine schlechte idee

    ich glaube darauf wollte der threadersteller hinaus

    Mag sein, aber seine Frage war:

    oder gibt es da noch eine andere möglichkeit?

    Und die gibt es!



  • arrAy schrieb:

    [ Nein die Funktion func soll kein string var ="Hallo"; zurück geben.
    Ich will wissen wie das ganze mit einem Array funktioniert.
    Nein ich will auch keinen Vector benutzen. ^^ ]

    Wozu soll das denn gut sein? std::string benutzt auch nichts anderes als ein Array. Der einzige Unterschied ist, dass er den Speicher automatisch wieder freigibt, wenn er zerstört wird, was ein Zeiger nicht tut.

    Wenn du C betreiben willst, mische das nicht mit C++. Auch wenn so etwas möglich ist, ist es sehr schlechter Stil.



  • Ja mit new und delete wäre es auch eine möglichkeit nur wie setze ich es hier richtig ein ?

    [ Nein ich will kein std::string benutzen da ich auch alternativ Lösungen kennen lernen möchte und wie man in solch einem Fall new und delete richtig verwendet. Ich will ja was lernen und nicht die erst beste Lösung verwenden. ]

    #include <iostream>
    using namespace std;
    
    char *func( );
    
    int main(int argc, char* argv[])
    {
    
    char *str = "0";
    
    str = func();
    
    cout<<str;
    
    system("PAUSE");
    }
    //---------------------------------------------------------------------------
    
    char *func ( )
    {
    char *var="0";
    
    var = new char[20];
    
    var = "hallo";
    
    delete [] var; // Ist ja quatsch das hier zu löschen das ruft doch ein
                   // undefiniertes Verhalten hervor oder täusche ich mich da ?
                   // hallo wird zwar richtig ausgegeben aber so ist da ja doch
                   // sehr fehleranfällig die Stelle im Speicher wo mein Wert liegt
                   // könnte ja überschrieben werden.
                   // Wie setzt man hier new und delete richtig ein ?
    
    return var;
    }
    


  • Siehe meinen vorletzten Beitrag... Da ist ein Codebeispiel.



  • Niemals in C++ in der Praxis so etwas machen:

    #include <cstring>
    #include <cstdio>
    
    char *get_string()
    {
    	char *p = new char[9]; //erstellt ein Array
    	std::strcpy(p, "unsicher"); //Kopiert die Zeichen im Literal einzeln in das Array, auf das p zeigt.
    	return p;
    }
    
    int main()
    {
    	char *p = get_string();
    	std::printf("%s\n", p); //wenn schon C, dann richtig
    	delete[] p; //löscht das Array
    }
    

Log in to reply