Anzeige:
Ergebnis 1 bis 15 von 15

Thema: zweites malloc nicht ausgeführt wenn in if-Abfrage

  1. #1
    Registrierter Benutzer
    Registriert seit
    27.05.2005
    Beiträge
    31

    zweites malloc nicht ausgeführt wenn in if-Abfrage

    Hallo!

    Ich habe folgenden Code:

    Code:
            if((article=(Article*)malloc(sizeof(Article)*MAX_ENTRIES)) == NULL && (cat=(Category*)malloc(sizeof(Category)*MAX_ENTRIES)) == NULL)
     	{
     	  printf("\nMemory allocation failed!\nExiting...\n");
      	  exit(1);
     	}
    
    .
    .
    .
    .
    
            if(!(*article_amount))
      	{
      	  memset((void*)article,0,MAX_ENTRIES*sizeof(Article));
      	}
      	
      	if(!(*cat_amount))
      	{
      	  memset((void *)cat,0,MAX_ENTRIES*sizeof(Category));
      	}
    Es soll für beide Structs entsprechend Speicher für ein Array alloziert werden.
    MAX_ENTRIES ist ein per #define definierter Wert von 4*1024.
    Theoretisch müssten beide Allozierungen durchgeführt werden, da beide
    Bedingungen per UND verknüpft sind.
    Ich habe aber festgestellt, dass in diesem Falle nur Speicher für article
    angefordert wird.
    Wenn ich die Pointer nämlich überprüfe sagt mir das Programm bei cat jediglich "(nil)", also hat gar keine Allozierung stattgefunden.
    Später stürzt das Programm dann natürlich bei memset ab.
    Im Moment habe Ich einfach zwei If-Abfragen hintereinander geschrieben, was aber unschön aussieht.
    Müsste der erste Weg denn nicht auch möglich sein?

  2. #2
    Registrierter Benutzer
    Registriert seit
    10.10.2005
    Beiträge
    39
    ein tip ins blaue:

    der operator && ist hoeherrangig als ==, also wird zuerst der part "NULL &&..." ausgefuehrt, und da eine UND-verknuepfung mit NULL immer NULL ergibt, wird der 2. teil gar nicht erst ausgefuehrt.

    ich rate dir zu extensivem gebrauch von klammern!

  3. #3
    Registrierter Benutzer
    Registriert seit
    22.08.2002
    Ort
    Nürnberg
    Beiträge
    638
    Außerdem ist die UND-Verknüpfung falsch.

    Denn was passiert, wenn Du noch genau soviel Speicher hast, daß nur die erste Speicherzuweisung von Erfolg gekrönt ist, die zweite aber nicht?

    Pingu
    Homepage: www.pingu.info

  4. #4
    Registrierter Benutzer
    Registriert seit
    27.05.2005
    Beiträge
    31
    @OpOs:
    Das hatte ich auch schon gemacht, leider mit keinem Erfolg, ich bekomme nach
    wie vor ein Segmention-Fault als Fehlermeldung.

    @Pingu:
    Dann soll das Programm abbrechen, weil dann gar nicht erst weiter gearbeitet
    werden braucht.

  5. #5
    Registrierter Benutzer
    Registriert seit
    22.08.2002
    Ort
    Nürnberg
    Beiträge
    638
    Dann schaue Dir Deinen Konstrukt noch einmal genau an und denke noch mal nach. Oder besser schreibe alle 4 Fälle auf, dann wird Dir etwas auffallen.

    Pingu
    Homepage: www.pingu.info

  6. #6
    Registrierter Benutzer
    Registriert seit
    10.10.2005
    Beiträge
    39
    pingu hat recht, da muss ein "||" hin, ansonsten wird nur abgebrochen, wenn beide anforderungen fehlschlagen

  7. #7
    Registrierter Benutzer
    Registriert seit
    27.05.2005
    Beiträge
    31
    gibt es hier im forum eine ecke, in die ich mich stellen kann? *schäm*

  8. #8
    Registrierter Benutzer
    Registriert seit
    09.04.2003
    Beiträge
    17
    Zudem sehe ich da ein hässliches memory leak im Falle eines fehlschlagens beim zweiten malloc.

    PS: Warum weigern sich so viele Leute else zu verwenden?

  9. #9
    Registrierter Benutzer
    Registriert seit
    22.08.2002
    Ort
    Nürnberg
    Beiträge
    638
    Sehe ich auch.

    Pingu
    Homepage: www.pingu.info

  10. #10
    Registrierter Benutzer
    Registriert seit
    27.05.2005
    Beiträge
    31
    Wird nicht der gesamte vom Programm angefordete Speicher spätestens bei Beendigung des Programms wieder freigegeben?

  11. #11
    Registrierter Benutzer
    Registriert seit
    22.08.2002
    Ort
    Nürnberg
    Beiträge
    638
    Kommt auf den Compiler sowie auf das Betriebssystem an. Jedenfalls sollte man sich nie darauf verlassen.

    Pingu
    Homepage: www.pingu.info

  12. #12
    Registrierter Benutzer
    Registriert seit
    27.05.2005
    Beiträge
    31
    Alles klar, danke für den Tipp.

  13. #13
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    So ist's schöner:
    Code:
    void* xmalloc(size_t size) {
      void* retval = malloc(size);
      if (retval == NULL) {
        fprintf(stderr, "Kein Speicher mehr!");
        exit(1);
      } // else 
      return retval;
    }
    
    ....
    article=(Article*)xmalloc(sizeof(Article[MAX_ENTRIES]));
    cat=(Category*)xmalloc(sizeof(Category[MAX_ENTRIES]));

  14. #14
    Registrierter Benutzer
    Registriert seit
    27.05.2005
    Beiträge
    31
    hmm, lecker, das is natürlich noch besser

  15. #15
    Registrierter Benutzer
    Registriert seit
    09.04.2003
    Beiträge
    17
    Nein, nicht ganz, das memory leak bleibt (ganz besonders, wenn man irgendwann auch noch das exit wegrationalisiert).

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •