Verständnissfrage zu realloc



  • Also die Funktionsweise von realloc ist mir schon soweit klar, meine eigentliche Frage ist folgende: wie benutzt ihr realloc richtig. Ich möcht dazu gerne 2 Codebeispiel geben um zu zeigen was ich meine:

    Beispiel 1: (ist meiner Meinung nach so nicht richtig)

    boolean ResizeBuffer(u_char *buffer, int size_buffer, int new_size){
    
    	if(new_size == 0){
    		free(buffer);
    		return TRUE;
    	}
    	buffer = realloc(buffer, new_size);
    	if(!buffer){
    		return FALSE;
    	}
    	return TRUE
    }
    

    Beispiel 2: (ist meiner Meinung nach so richtig, ist es aber auch die Beste Lösung?)

    boolean ResizeBuffer(u_char *buffer, int size_buffer, int new_size){
    
    	u_char		*tmp_buffer;
    
    	if(new_size <= 0){
    		if(size_buffer > 0){
    			free(buffer);
    		}
    		return TRUE;
    	}
    	tmp_buffer = malloc(new_size);
    	if(!tmp_buffer){
    		return FALSE;
    	}
    	if(size_buffer > 0){
    		memcpy(tmp_buffer, buffer, size_buffer);
    		free(buffer);
    	}
    	buffer = tmp_buffer;
    	return TRUE
    }
    

    Da ich beim Einsatz von realloc nicht immer diese ganzen Aufrufe schreiben möchte, dachte ich mir ich lagere sie in einer externen Funktion aus. Natürlich sollte diese Funktion dann auch wasserdicht sein, daher meine Frage, ist die Funktion so ok, oder würdet ihr das anderst machen, wenn ja wie. Ich wäre für konstruktive Kritik sehr dankbar.



  • Ups, da ist mir doch tatsächlich schon ein Bug aufgefallen, wenn "new_size < size_buffer" ist crasht die Funktion. Ok da muss dann noch ein Check rein.



  • Beide Varianten sind falsch, weil der Pufferzeiger by value übergeben wird. Überhaupt ist das Gehampel, das du da veranstaltest, unnötig. Ob du jetzt den Rückgabewert von realloc auf NULL prüfst, oder den Rückgabewert dieser Funktion auf false, ist doch egal.



  • MFK schrieb:

    Beide Varianten sind falsch, weil der Pufferzeiger by value übergeben wird.

    Du willst damit also sagen, daß die zweite Variante so gar nicht funktionieren kann, abgesehn von dem vom mir bereits festgestellten Bug?

    MFK schrieb:

    Überhaupt ist das Gehampel, das du da veranstaltest, unnötig. Ob du jetzt den Rückgabewert von realloc auf NULL prüfst, oder den Rückgabewert dieser Funktion auf false, ist doch egal.

    Da magst du Recht haben, da ich es eben nicht besser weiss frage ich hier ja nach. Ok dann hier Beispiel 3, ist das besser?:

    int ReAllocBuffer(u_char *buffer, int new_size){
    
    	u_char		*tmp_buffer;
    
    	if((new_size == 0) && (buffer == NULL)){
    		return 0;
    	}
    	tmp_buffer = realloc(buffer, new_size);
    	if(!tmp_buffer){
    		if(new_size == 0){
    			return -1;	//Speicher konnte nicht angefordert werden, der Speicherbereich von "buffer" und dessen Inhalt existieren nicht mehr, es wurde "free(..)" ausgeführt 
    		}else{
    			return -2;	//Speicher konnte nicht angefordert werden, der Speicherbereich von "buffer" und dessen Inhalt existieren noch
    		}
    	}
    	buffer = tmp_buffer;
    	return 0;
    }
    


  • Rainman schrieb:

    buffer = tmp_buffer;

    damit änderst du nicht deinen echten pointer, sondern nur die kopie in der funktion. mach's mit doppelpointer, so etwa:

    int my_realloc (void **buff, size_t size)
    {
      void *new;
    
      if (buff == 0 || *buff == 0 || size == 0)
        return 0;  // mieser input
    
      new = realloc (*buff, size);
      if (new == 0)  
        return 0; // realloc failed
    
      *buff = new; // hat geklappt, original-pointer umsetzen
      return 1;   
    }
    

    aufrufen geht dann so:

    char *p = malloc(10);  // zehn zeichen
    ...
    if (1 == my_realloc (&p, 1000))  // mal mehr werden lassen
    {
      // hat geklappt, ab jetzt kannstes benutzen.
      ...
    }
    ...
    

    🙂



  • @+fricky
    Vielen herzlichen Dank, das nenn ich doch wieder mal kompetete Hilfe. Erstmal auf den Fehler hingewiesen, dann erklärt warum Fehler und dann eine richtige Lösungsmöglichkeit aufgezeigt.

    Ein Grund warum ich so gerne hier im Forum poste, hier wird man fast nie mit ungelösten Problemen alleine gelassen.



  • Rainman schrieb:

    Erstmal auf den Fehler hingewiesen

    das mit dem pointer hat dir MKF aber auch schon erzählt.
    🙂


Anmelden zum Antworten