Character Array Problem mit Pointern über Funktion...



  • hi leute

    ich hab ein kleines problem und verstehe nicht ganz woran das liegt.

    ich denke code sagt mehr als tausend worte also hier:

    So funktioniert es und so änlich will ich es haben:

    #include <stdio.h>
    #include <stdlib.h>
    
    char * a() {
        char * t = "Hallo Welt";
        return t;
    }
    
    int main(void) {
        printf("%s\n", a());
        system("PAUSE");
        return 0;
    }
    

    Das problem ist ich kann den string nicht direkt beim erstellen füllen, also muss ich dieses erst initialisieren. Und hier komme ich nicht weiter, weil sobald ich versuche die adresse dieses initialisierten Arrays zu übergeben nur murks rauskommt, aber nicht der eigentliche Text.
    Das ganze schaut dann ungefähr so aus:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char * b() {
        char t[20];
        strcpy(t, "Hallo Welt");
        char * r = &t;
        return r;
    }
    
    int main(void) {
        printf("%s\n", b());
        system("PAUSE");
        return 0;
    }
    

    So, und hier steck ich nun fesst, ich hab schon etliches probiert aber noch kein Erfolg gehabt.

    Ich hab auch schon die Adressen IN der Funktion und später im MAIN überprüft. Sie sind beide Identisch nach der übergabe. Aber ich bekomm einfach den dazugehörigen Text zu dieser Adresse nicht raus.

    vieleicht seht ihr ja den Fehler oder habt nen TIPP.
    Gruß



  • char *b (void) 
    {
        static char t[20] = "Hallo Welt";
        return t;
    }
    

    🙂



  • mein fehler, das hat ja keine auswirkung *gg*

    jetzt aber meine Frage, wozu das static, gibts da ne erklärung dafür?

    was hat das für auswirkungen? was hat das für evtl. nachteile?

    hättest du ne bessere lösung text über funktionen zurückzugeben ohne direkt mit string zu initialisieren?



  • UnIoN schrieb:

    das char array wird später mittels einer anderen funktion gefüllt, desshalb kann ich das so nicht direkt füllen wie in deinem code.

    auf das array kannst du auch von ausserhalb der funktion zugreifen (static), den inhalt verändern usw...



  • UnIoN schrieb:

    jetzt aber meine Frage, wozu das static, gibts da ne erklärung dafür?

    normale variablen sind nur innerhalb der funktion verfügbar. der speicherplatz wird für was anderes verwendet, wenn die funktion verlassen wurde. static-variablen bleiben, im gegensatz dazu, erhalten. 🙂



  • das bedeutet also ohne das static übergebe ich zwar die adresse, aber der inhalt geht verloren. und mit static bleibt der erhalten...

    oder bleibt hier sogar der variablen name erhalten? das wäre doch nicht so gut, man stelle sich nur mal ein größeres projekt vor, wie soll man dann die zich variablen koordinieren...

    oder hab ich das falsch verstanden? ich dachte eigentlich selbst wenn der zugriff verloren geht der speicher erhalten bleibt bis es von etwas anderem überschrieben wird. dann dürft ja nicht etwas anderes drin stehen wenn ich dann ja die adresse noch hab...



  • UnIoN schrieb:

    ich dachte eigentlich selbst wenn der zugriff verloren geht der speicher erhalten bleibt bis es von etwas anderem überschrieben wird. dann dürft ja nicht etwas anderes drin stehen wenn ich dann ja die adresse noch hab...

    ja, aber du weisst nie, für welchen zweck der speicher der ehemaligen variablen wieder recycled wird. der speicher von static-variablen ist 'fix' und während der gesamten programmlaufzeit wird er nicht ohne dein zutun verändert.
    🙂



  • alles klar hast mir super geholfen danke 🙂

    eine letzte frage hätt ich noch, weißt du wo ich tiefergehende informationen zu static nachlesen kann oder wars das schon?

    mich würden die hintergründe instressieren, also was mit dem speicher passiert, wie es wieder freigegeben wird, wie es in einem komplexen projekt aussehen könnte und ob es überhaupt gut ist static zu verwenden. Dann auch evtl. vor und nachteile.

    weißt/hast du da was für mich? Die tuts und bücher die ich bisher gelesen habe haben das immer nur mit einem einzigen Satz abgehakt und gingen da nie weiter darauf ein.

    vieleicht gibt es da ja auch nichts weiter zu erklären. Aber ich frage lieber nach als später wieder vor ein problem zu stehen wo ich mit solchen hintergrundinfos weiterkäme ^^ 😃


Anmelden zum Antworten