malloc(), free()



  • Hallo!

    Ich lerne gerade für eine C-Klausur und bin bei dieser Vorlesungsfolie in meinen Unterlagen stutzig geworden:

    Im folgenden Beispiel wird sichergestellt, dass nur ein erfolgreich angelegter Speicherblock freigegeben wird

    double *vector = (double*) malloc(3*sizeof(double));
      if(!vector)
      {
        free(vector);
        vector = 0;  /* good practice: invalidate pointer */
      }
    

    Zu meiner Frage: ich dachte if() wird immer dann ausgefuehrt, wenn der Inhalt der Klammer wahr ist (also ungleich 0). Wenn der Speicher erfolgreich angelegt wurde sollte vector doch eigentlich ungleich 0 sein. Weiter dachte ich, dass !ungleich null == 0. Stimmt das soweit? Dann sollte if() ausgeführt werden, wenn der Speicher NICHT angelegt wurde und nicht wie im Erklärungstext steht, wenn der Speicher angelegt werden konnte.
    😕 hab ich was falsch verstanden was die Bedeutung von if(!0) if(1) und if(0) angeht? oder ist ein Fehler in meiner Folie?


  • Mod

    Der Code ist voller worst-practices und ziemlicher Unsinn.

    double *vector = (double*) malloc(3*sizeof(double));
    

    ➡

    double *vector = malloc(3* sizeof *vector);
    
    if(!vector)
      {
        free(vector);
        vector = 0;  /* good practice: invalidate pointer */
      }
    

    ➡

    free(vector);
    

    Der Fehler den du da gefunden zu haben meinst ist übrigens tatsächlich da.



  • wenn malloc fehlschlägt, bekommst du einen 0 Zeiger.
    Und ein free auf einen 0 Zeiger ist kein Problem.

    Die Abfrage auf 0 macht aber dann Sinn, wenn du tatsächlich auf den Speicher zugreifst.

    int *ptr=malloc(100*sizeof(int));
    
    if(ptr)
    {
     // ...mach irgendwas mit dem Speicher...
     ptr[77]=12;
     // ...usw...
    }
    
    free(ptr);
    


  • SeppJ schrieb:

    double *vector = (double*) malloc(3*sizeof(double));
    

    ➡

    double *vector = malloc(3* sizeof *vector);
    

    Wieso is das denn eine "worst-practise", das hilft doch der Codekompatibilität mit C++!?




  • Mod

    dot schrieb:

    Wieso is das denn eine "worst-practise", das hilft doch der Codekompatibilität mit C++!?

    Wieso sollte ich C-Code zu C+ kompatibel halten? Alles was ich mir dafür einbrocke sind mögliche Fehler.



  • melondolphin schrieb:

    double *vector = (double*) malloc(3*sizeof(double));
      if(!vector)  <-- sollte wohl auch eher (vector) heißen
      {
        free(vector);
        vector = 0;  /* good practice: invalidate pointer */  <-- Schrott, schrottige Praktik
      }
    

    Viele Compiler produzieren Code, der abbricht, wenn man einen identischen Speicherbereich mehrfach mit free freigibt.
    Durch deine Schrott-Praktik verhinderst du, dass das Programm dich auf diesen deinen Designfehler hinweist; du verschleierst also deinen Fehler, der Compiler, der im Gegensatz zu dir keine Fehler macht, hat keine Möglichkeit mehr, dich auf deine Fehler hinzuweisen.

    double *vector = malloc(3*sizeof*vector);
      if(vector)
      {
        macheirgendwasmit(vector);    
      }
      free(vector);
    

Log in to reply