Tina: C/C++: free -> Fehler

Moin,

leider führt der free() Befehl zu einem unangenehmen Fehler, der sich nicht beheben lassen will, sodass ich nun Euch um Rat fragen möchte.
Die Source enthält u.a.:
       char b=0;
       char *a;
       a=(char*) malloc(b);
       free(anfang);//<-  passierts: run-time check failure #2 stack around the variable 'b' was corrupted

Hoffe, Ihr wisst, was daran nicht passt.

Danke schonmal

  1. Moin,

    Die Source enthält u.a.:
           char b=0;
           char *a;
           a=(char*) malloc(b);
           free(anfang);//<-  passierts: run-time check failure #2 stack around

    the variable 'b' was corrupted

    Ich denke mal, anfang soll a heißen, oder? Ansonsten gibt bitte den Codeteil an, aus dem anfang stammt.

    Ansonsten ist der Fehler für mich klar:

      
    char b = 0;  
    
    

    Hier bekommt b den Wert 0.

      
    a = (char *)malloc(b);  
    
    

    Hier rufst du malloc auf. b hat den Wert 0. Ergo steht dort malloc(0).
    Daher dürfte gar kein Speicher reserviert werden...

      
    free(a);  
    
    

    Hier willst du einen Speicherbereich der Länge 0 freigeben. Das MUSS schiefgehen.

    Keiner Tipp noch: Insbesondere bei C-Strings würde ich nicht mit malloc arbeiten, sondern mit calloc. Z.B. reserviert dir

      
    char *str;  
    str = calloc(256, sizeof(char));  
    
    

    Speicher für einen String mit 255 Zeichen (das letzte ist für '\0'). Netterweise setzt calloc auch noch alles auf '\0', so dass der String in jedem Fall terminiert ist. Bei malloc ist der Zustand des Speichers nicht definiert. Bei malloc musst du noch ein memset hinterhermachen.

    Gruß

    Stareagle

    1. Hallo,

      char b = 0;

      
      >   
      > Hier bekommt b den Wert 0.  
      >   
      > ~~~c
        
      
      > a = (char *)malloc(b);  
      > 
      
      

      Hier rufst du malloc auf. b hat den Wert 0. Ergo steht dort malloc(0).
      Daher dürfte gar kein Speicher reserviert werden...

      Jain. Laut Standard ist es der Implementierung überlassen, ob sie bei malloc(0) KEINEN Speicher reserviert und NULL) zurückgibt - was dann zu einem Fehler führt ODER ob sie tatsächlich einen 0 Byte großen Speicherbereich reserviert, der dann auch zurückgegeben wird und per free() wieder freigegeben werden kann/muss.

      Da das aber wie gesagt der Implementierung überlassen ist, würde ich malloc() definitiv NIE 0 übergeben wollen.

      Viele Grüße,
      Christian

  2. moin, moin

      
    
    >        char b=0;  
    >        char *a;  
    >        a=(char*) malloc(b);  
    >        free(anfang);//<-  passierts: run-time check failure #2 stack around the variable 'b' was corrupted  
    
    

    sollte b nicht besser vom Typ int oder unsigned int sein und b>0 ?

    Gruß plan_B

    --
         *®*´¯`·.¸¸.·
  3. Hi Tina,

    char b=0;
           char *a;
           a=(char*) malloc(b);
           free(anfang)

    du hast ja schon einige Tipps bekommen.
    Die dynamische Speicherbeschaffung ist eine tolle Sache, jedoch sollte man dort auch sehr defensiv programmieren. Es kann viel schief gehen, wie du gemerkt hast.

    1. Sollten Zeiger immer mit NULL inisaliziert werden
      also char *a = NULL;

    2. Die Speicherbeschaffung kann schief gehen, also immer prüfen
      a=(char*) malloc(b);
      if ( a == NULL ){
       exit(EXIT_FAILURE);
      }

    MfG
    Otto