Sinvolle Programmierung mit char[]/char*/malloc/free ?



  • Ich programmier ja nicht wirklich viel in C, aber wenn ich was mache, hab ich immer logik Probleme mit dem verwenden von char arrays in (ich sag mal so) komplexeren strukturen.

    Ich arbeite gerne mit funktionen/methoden, so viel wies eben geht. Trägt der übersicht halt bei, is ja logisch.

    Doch wie implementiere ich sinnvoll solche funktionen?

    char *testfunc(char *test) {
      hole dir einen teilstring aus *test
      kopiere den in eine neue variable
      mach damit irgendwas
      gebe den per return zurück
    }
    

    Das bedeutet ja für die return Variable muss ich eine neue Var anlegen, sprich speicher reservieren.
    Jetzt könnte ich entweder folgedes machen:
    a) static char retstring[500];

    oder
    b)
    char *retstring
    retstring = malloc (benoetigtelaenge * sizeof(char));

    zu a) ich weiß aber nicht wie groß ich retstring reservieren soll, da ich den zu bearbeitenen string nicht kenne. ein
    static char retstring[benoetigteleange]
    geht nicht, gib compiler error weil die länge nicht bekannt ist.

    zu b) das mit dem reservieren geht natürlcih einwandfrei,
    aber ich muss den ja auch mit free(retval) wieder freigeben.

    Nur wo pack ich das free hin?

    Innerhalb der funktion bringt es nix, weil ich will den wert ja zurückgeben.

    Außerhalb der Funktion im Programmcode wo die funktion aufgerufen wurde, hat das meiner Meinung vom Codingstyle her nix zu suchen.

    Weil eine Funktion ist für mich eine abgeschlossene Einheit.
    Ich fülle etwas hinein, und bekomme etwas heraus. Was dadrin passiert interessiert mich nicht. Mich interessiert nur das gewünschte Ergebniss das ich von der Funktion erwarte.

    Somit kann ich (stupide) gesagt auch nicht wissen das diese Funktion einen speicher reserviert den ich manuell wieder frei geben muss.

    gut möglichkeit c)
    ich übergebe der Funktion 2 char* Parameter. Input/Output

    aber auch hier kann ich vorher im hauptprogramm nicht wissen wie groß ich reservieren muss.

    Irgendwie seh ich den Wald vor lauter Bäumen nicht.
    Oder ist es üblich einfach ein char[] zu vereinbaren mit einer möglichst großen Größe wo man glaubt (ich mag keine Ratespiele) der wird für alle erdenklichen Fälle groß genug sein.

    Grüße Jan



  • Du hast das schon richtig erkannt: Wenn man in einer Funktion speicher alloziert vergisst man oft den nacher wieder freizugeben, vor allem wenn jemand die Funktion verwendet, der sie nicht geschrieben hat. Deshalb schreibt man Funktion meist so dass Speicher schon davor alloziert werden muss und dann dieser Speicherbereich übergeben wird:

    void testfunc(char* src, char* trg) 
    {
        hole teststring aus *src
        schreibe in *trg
    }
    

    Gruß



  • Andernfalls mußt du dem Nutzer deiner Testfunktion mitteilen, daß (und bei C++ eventuell auch wie) er den von der Funktion reservierten Speicher wieder freigeben muß.

    (von der Variante mit dem static-Array rate ich persönlich ab, wenn du auf Wiederverwendbarkeit deiner Funktion achten willst ;))

    PS: "sizeof(char)" ist übrigens garantiert gleich 1, das kannst du also im malloc()-Aufruf weglassen 😉



  • zusatz zu fireflows post:
    in dem fall uebergibt man noch die laenge des speicherbereichs, damit man nicht drueberschreibt.
    dass die aufrufende funktion den speicher stellt, ist uebliche praxis. siehe fgets()...


Anmelden zum Antworten