array ausgeben



  • Da tut sich nichts:

    #include <stdio.h>
    
    char* kuh() {
       char bla[4];
       bla[0]='m';
       bla[1]='u';
       bla[2]='h';
       bla[3]=0;
       return bla; //das ist doch ein Char*, oder?   
    }
    
    int main() {
      printf("%s",kuh());
      getchar();
    }
    

    Ich brauch das, weil ich mir als Übung selber eine IntegerToString()-Funktion schreiben will, und ich die einzelnen Stellen in einer Schleife beschreiben will.



  • obbba schrieb:

    Da tut sich nichts:

    #include <stdio.h>
    
    char* kuh() {
       char bla[4];
       bla[0]='m';
       bla[1]='u';
       bla[2]='h';
       bla[3]=0;
       return bla; //das ist doch ein Char*, oder?   
    }
    
    int main() {
      printf("%s",kuh());
      getchar();
    }
    

    Ich brauch das, weil ich mir als Übung selber eine IntegerToString()-Funktion schreiben will, und ich die einzelnen Stellen in einer Schleife beschreiben will.

    Du gibst einen Zeiger auf ein lokales Objekt zurück.
    bla existiert nach verlassen der Funktion nicht mehr!



  • Mach mal

    static char bla[4];
    

    Ohne static ist bla nach verlassen der Funktion nicht mehr gültig. Es _kann_ funktionieren, aber verlassen kann man sich darauf nicht (wie eben bei dir).

    Zu:

    return bla; //das ist doch ein Char*, oder?
    

    Dazu empfehle ich folgende Lektüre:
    http://www.c-faq.com/aryptr/aryptr2.html
    http://www.c-faq.com/aryptr/aryptrequiv.html

    Oder gleich das ganze Kapitel:
    http://www.c-faq.com/aryptr/index.html

    Oder am besten die ganze FAQ 😉 (ist imho die beste wo gibt):
    http://www.c-faq.com/



  • Ist halt leider english...
    Aber ich versuche es trotzdem zu verstehen.

    Mit static klappt es.

    Da muss ich ja nicht static int schreiben:

    #include <stdio.h>
    
    int test() {
        int temp=4;
        return temp;
    }
    
    int main() {
        printf("%d",test());
        getchar();
    }
    

    Ich hatte gedacht, das das so ähnlich wäre.



  • Nein! ints (genau wie chars, longs, ...) die nichts mit Zeigern
    zu tun haben, können zurückgegeben werden.



  • Und wenn ich den Zeiger in einen Int caste?
    Die sind ja beide 4 Bytes groß.

    (Verstehe ich überhaupt das richtige unter Casts?)



  • Schon aber dann gibst du nur die Adresse, an der deine Daten stehen, zurück.
    Aber der Speicher unter der zurückgegebenen Adresse wird beim nächsten
    Funktionsaufruf wieder benutzt und eventuell überschrieben.



  • obbba schrieb:

    Und wenn ich den Zeiger in einen Int caste?

    mit casten geht's nicht, höchstens so:

    // nur wenn sizeof(int) == 4
    int test (void)
    {
       int x;
       char *p = (char*)&x;
       *p++ = 'm';
       *p++ = 'u';
       *p++ = 'h';
       *p = 0;
       return x;
    }
    


  • strings sind zeichenketten irgendwo im speicher.
    char* sind zeiger auf zeichen(ketten).

    ein char[] ist ein array von chars.

    wenn du ein array zurueckgibst, gibst du die adresse des ersten elements zurueck.

    arrays verschwinden, wenn du die funktion verlaesst.

    in folgendem code zeigt <quux> in die pampa, denn das array wird bei der rueckkehr der funktion zerstoert.

    char *func(void)
    {
        char foo[] = "hallo";
        return foo;
    }
    
    char *quux = func();
    

    ein "static" vor die arraydefinition setzen bewirkt, dass du bei jedem return den gleichen pointer kriegen wuerdest und nach dem return der speicher noch nicht freigegeben ist.

    "string" ist kein datentyp. es gibt nur "pointer auf char" und "array von chars" und arrays kannst du nur als zeiger an funktionen uebergeben oder zurueckgeben.



  • Als Alternative zu dem "static" (damit arbeitet jeder Funktionsaufruf mit dem selben Array, überschreibt also möglicherweise Daten, die du an anderer Stelle noch brauchen könntest) kannst du noch den Speicher auf dem Heap anfordern (mit malloc() und Co. - das Hauptprogramm muß ihn dann per free() freigeben) oder von außen übergeben bekommen (als Parameter).



  • Ist das die strdup methode?



  • Hab ich zwar noch nie angewendet, aber ja: strdup() dürfte den neuen Speicher per malloc() anfordern.

    (ich arbeite eher mit C++ - und dann mit Objekten wie string oder vector, die ihren Speicher selber veralten)



  • Ah, mit 'string' hat man die ganzen Scheissereien nicht mehr? Klingt cool. Danke. :-).



  • "string" ist nicht mehr c und in c++ sind strings keine typen erster klasse. stringliterale sind immernoch char*...


Anmelden zum Antworten