stilfrage



  • was ist eigentlich besser?(stilmäßig)

    ich habe eine funktion die gibt eine struct zurück und sieht ungefähr wie folgt aus

    Sbla foo(const char*filename)
    {
    Sbla blubb;
    ...

    return blubb;
    }

    so im hauptprogramm ist nun der der die funktion benutzt verantwortlich für speicherallokierung usw.
    man muss praktisch sowas hier haben

    Sbla inhalt;
    ...
    inhalt = (Sbla
    )malloc(sizeof(*inhalt));
    ...
    *inhalt = foo(datei);
    ...
    free(inhalt);

    so ich weiss jetzt nich wie "benutzerfreundlich" das ist...wegen dem *inhalt = foo(datei) das könnte man für ungewöhnlich halten...

    die alternative wäre

    Sbla *foo(const char*filename)
    {
    Sbla blubb;
    blubb = (Sbla
    )malloc(sizeof(*blubb));
    ...
    return blubb;
    }

    im hauptprogramm wäre das dann wie folgt

    Sbla *inhalt;
    ...
    inhalt = foo(datei);
    ...
    free(inhalt);

    so nun bin ich mir aber nicht so ganz sicher...weil beim ersten ist es praktisch das auf das malloc das entsprechende free zu sehen ist...bei der zweiten variante wäre das nicht so...und man könnte sicher unter umständen das free mal vergessen (ginge nicht beim ersten)

    vielleicht hat jmd ne idee dazu...

    bye

    PS: gibts irgendsowas wie ein C Style guide? wo solche fragen geklärt sind? bzw. hilfreiche tipps gegeben werden?



  • deine 1. variante ist bloedsinn:

    statt
    s* p=malloc(sizeof *p);
    *p=foo();
    free(p);

    schreibe ich doch
    s p=foo();

    btw: den rueckgabewert von malloc castet man nicht!!

    ich wuerde dieser variante tendieren. alternativ gibts folgende beiden:

    s s;
    foo(&s);

    oder
    s* p;
    p=getFoo();
    freeFoo(p);

    wobei es jetzt eben auf die semantik ankommt was denn nun s genau darstellt.

    aber eins ist boese:

    s* p;
    p=foo();
    free(p);

    denn kaum jemand wir heir ein fehlendes free() erkennen, denn normalerweile sucht man nach malloc/calloc/realloc und free und nicht foo und free.



  • Hallo.

    Ich würde sagen, das malloc() und free() möglichst nahe beieinander aufgerufen werden sollte (Variante 1). Alles andere führt in C meist zu undurchsichtigen Code.



  • shade
    *****

    was isn an meiner ersten variante blödsinn? bis auf das es nicht statisch ist...???

    bye

    PS: und ich caste malloc so oft und gerne wie ich möchte...ich vertraue dem compiler nicht "absolut"



  • TheTester schrieb:

    ...
    PS: und ich caste malloc so oft und gerne wie ich möchte...ich vertraue dem compiler nicht "absolut"

    Also _das_ ist jetzt wirklich Blödsinn! Es gibt IMHO keinen guten Grund, warum man malloc() casten sollte und damit schlauer sein will als der Compiler. Überdeckst Du an Deinem Auto auch das Öl-warm-Lämpchen, wenn es aufleuchtet?!?



  • nu ja sagen wirs so ich mach das vielleicht aus reiner faulheit damit ich weiss was malloc für einen rückgabewert hat sprich das ich weiss was das für eine variable ist die ne adresse von malloc zugewiesen bekommt...sonst müsste ich immer erst nachschauen wenn ichs mal vergessen hab das finde ich mühselig

    meinetwegen mag das nicht rational und auch wirklicher blödsinn sein *schulterzuck* is mir aber egal 🙂 da ich eher son quartalsprogrammierer bin und damit bis jetzt noch nie probleme hatte 🙂

    bye



  • TheTester schrieb:

    was isn an meiner ersten variante blödsinn? bis auf das es nicht statisch ist...???

    mehr speicher verbrauch (nämlich 1 pointer)
    längere laufzeit (durch die indirektion und einen malloc/free aufruf)
    potentielles speicherleck (ein free() kann man ja mal vergessen)

    weiters sieht
    *p=foo();
    einfach doof aus - und ich habe es noch nie gesehen...

    und ich caste malloc so oft und gerne wie ich möchte...ich vertraue dem compiler nicht "absolut"

    1. solltest du deinem compiler vertrauen, denn der versteht mehr von C und optimierungen als du (oder ich oder sonstwer)
    2. kann ein casten bei malloc einen fehler erzeugen. nämlich dann wenn du vergisst stdlib.h zu inkludieren und ein zeiger nicht genausogross wie ein int ist. dann gibts undefiniertes verhalten. und wofür? für nix und wiedernix.

    du sagst der stil ist dir egal?
    ja, was fragst du uns dann??



  • weil ich dich nich zum stil von meinem malloc gefragt hatte 🙂 und das andere hab ich dann schon abgeändert :)(ja und auch malloc wobei es mir schleierhaft ist wie man vergessen kann die stdlib einzubinden...)

    bye



  • TheTester schrieb:

    wobei es mir schleierhaft ist wie man vergessen kann die stdlib einzubinden...)

    zB um kompilier Zeit zu sparen.
    du inkludierst keine header und kannst so schneller kompilieren.

    bzw. in irgendeiner datei kann man ja das include vergessen - dann warnt dich niemand wenn du castest. wenn du nicht castest kommt mindestens eine warnung.



  • naja ich war noch nie in der verlegenheit header exkludieren zu müssen um compile zeit zu sparen 😉 meine projekte sind eher so winzig...ob das nun in 2 oder 5 sek. kompiliert macht mir nix aus 😉

    jo und das mit den warnings und malloc hab ich schon begriffen...

    bye

    tt



  • wobei

    inhalt = (Sbla*)malloc(sizeof(*inhalt));
    

    nicht nur wegen dem Cast schlimm ist, sondern auch weil du einen Zeiger dereferenzierst, der nicht initalisiert ist!

    Aber zur eigentlichen Frage

    ich würde möglichst dafür sorgen, dass ich kein Dinge zurückgebe, die ein User explizit freigeben muss, dass kann man leicht vergessen (natürlich rede ich nicht von Funktionen, wo klar ist, dass diese Daten zurückgeben, die man explizit freigeben muss 🙄 )

    Ansonsten kannst du außerdem noch folgendes machen

    void foo(const char *filename, sbla *obj);
    


  • kingruedi schrieb:

    wobei

    inhalt = (Sbla*)malloc(sizeof(*inhalt));
    

    nicht nur wegen dem Cast schlimm ist, sondern auch weil du einen Zeiger dereferenzierst, der nicht initalisiert ist!

    augen auf du schlafmuetze.
    *inhalt wird innerhalb von sizeof aufgerufen, folglich dereferenziert es nicht den wert, sondern den typen 😉



  • Ich habe festgestellt das das Buch
    C Elements of Style von Steve Oualline ein sehr guter Style Guide ist.

    Aus meiner Sich würde ich auch zu dem malloc und free im aufrufenden Programm tendieren, habe schon eine Menge Schlechter erfahrung gemacht mit ''versteckten Allocierungen''

    🕶


Anmelden zum Antworten