String aus funktion zurückgeben



  • Sry ich hab mich wohl unklar ausgedrückt 😃

    Mir werden folgende Fehlermeldungen angzeigt:

    11 [Warning] return makes integer from pointer without a cast
    11 [Warning] function returns address of local variable

    Das Programm startet, ich geben ein Wort ein, drücke Enter und dann hängt sich das Programm auf.

    Ich verstehe nicht was gemeint ist mit den Fehlermeldungen oder wie ich sie beheben kann.



  • - du gibst lokalen Speicher deiner Funktion an main zurück; dieser ist nicht mehr gültig nach Funktionsaufruf in main, d.h. UB
    - du benutzt grundlos VLA
    - "max" benennt man KEINE globale Konstante
    - fgets liefert meist endendes '\n' am String, das du auch mit umkehrst
    - fgets liefert nicht "ein Wort" wie verlangt sondern u.U. mehrere Wörter im String
    - char ist falscher return-Typ, Zeiger auf char wäre richtig



  • roflrudi schrieb:

    11 [Warning] return makes integer from pointer without a cast
    11 [Warning] function returns address of local variable

    [...]

    Ich verstehe nicht was gemeint ist mit den Fehlermeldungen oder wie ich sie beheben kann.

    Beide beziehen sich auf Zeile 11: return s2;

    s2 ist bei dir ein funktionslokales Array, das nach Ende der Funktion garnichtmehr existiert. Es macht daher keinen Sinn, es (bzw. da ein Array in einen Pointer zerfällt: einen Pointer darauf) zurückzugeben, da der Aufrufer deiner Funktion inverter() damit sowieso nichts anfangen kann (und darf!).
    Weiters gibt deine Funktion inverter() etwas vom Typ char zurück, ein Typ für ein Zeichen. Dein Compiler sieht aber beim return , daß du einen Pointer to char (in das zerfällt dein Array) zurückgibst, muss den zwangsweise aber in den Rückgabetyp char stopfen, und warnt dich davor (return makes integer from pointer without a cast), weil du das mit ziemlicher Sicherheit nicht willst.

    // edit: meingott, bin ich laangsam 😮



  • ok den ersten Fehler verstehe ich und weis auch wie ich ihn beheben kann.
    Aber ich verstehe nicht wie ich den zweiten beheben soll 😕



  • Drei Möglichkeiten:

    • s1 direkt in sich selbst umdrehen
    • inverter() als weiteren Parameter einen Zeiger auf den Bereich zum schreiben geben
    • in inverter() Speicher für s2 dynamisch anfordern


  • ups jetzt hast mich falsch verstanden 🙂
    ich meinte den anderen fehler den ich nicht verstehe 🙂
    also:
    11 [Warning] return makes integer from pointer without a cast

    das mit der lokalen variable verstehe ich 🙂



  • Du machst sinngemäß

    char foo( void )
    {
        char * ptr = 42;
        return ptr;
    }
    

    In Zeile vier muss also ein char* in einen char umgewandelt werden. Davor wirst du gewarnt.



  • Und den Terminator '\0' hast du auch vergessen.
    Sowohl den Platz dafür, als auch ihn zu schreiben.



  • Mit return s2 gibst du in wirklichkeit einen Zeiger auf das erste Element des Arrays zurück.Der Compiler meckert,weil du bei deiner Funktion den Rückgabewert char und nicht char * angegeben hast.

    Mal eine andere Frage an alle hier,wieso kann der Thread Ersteller die größe des Arrays mithilfe einer Funktion ermitteln

    laenge = strlen(s1);
        char s2[laenge];
    

    Muss bei einem Array nicht ein konstanter Wert/Ausdruck zur Angabe der Größe verwendet werden?



  • Das sind VLA, deren Größe erst zu Laufzeit feststeht. Außerdem ist die Länge hier um 1 zu klein.



  • Das nennt sich Variable Length Array (kurz VLA) und ist seit C99 im Standard.

    Mit C11 wurde es aber teilweise zurückgenommen. Es ist kein Muss mehr.



  • Ich danke euch.
    👍


Anmelden zum Antworten