free() problem



  • hi Leute, ich bins mal wieder ich habe da ein verständisproblem mit free (); ich habe hier ein programm geschrieben das zeiger benutzt, nun soll ich eben free(x) einsetzen für den zeiger damit der speicher wieder freigegeben wird, aber ich bekomme in jeder Zeile einen Fehler , oder das programm stürt gleich ab, kann mir jemand mit erklären woran das liegt ? wäre sehr nett danke. 🙂

    denn wenn ich free in der main funktion setze sagt mir mein programm x kann nicht benutzt werden, setze ich es in die funktion oben, bricht er immer ab und eine Fehlermeldung erscheint.

    #include <stdio.h>
    #include <stdlib.h> 
    
    float harmonisches_mittel(int anz)
    {
    	float summe=0.0;
    	float *x=(float*)malloc(anz);
    	int i=0;
    	for(i=0; i<=anz-1; i++)
    	{
    		do // schleife 
    		{
    		printf("\nBitte Zahl eingeben: "); 
    		scanf("%f", &x[i]);
    			}
    			while(x[i]<=0); 
    			}
    		summe=0;
    		for(i=0;i<=anz-1;i++)
    		{
    		summe=summe + (1/x[i]);
    		}
    	summe=anz/summe;
    	return summe;
    }
    
    int main() 
    {
    	float harmonisches_mittel(int anz);
    	int n=0;
    	float neuer_wert = 0.0;
    	do
    		{
    		printf("\n0 und negtaive n werte werden nicht berechnet, Bitte jetzt n eingeben: ");
    		scanf("%d", &n);
    		}
    	while(n<1);
    	neuer_wert = harmonisches_mittel(n);
    	printf("\nHarmonisches Mittel ist: %2.02f", neuer_wert);
    	getch();
    }
    


  • free ist das Gegenstück zu malloc. Du kannst nur Speicher mit free freigeben den du mit malloc geholt hast.

    Dein einziges malloc steht in Zeile 7 und wird der Variablen x zugewiesen. Du musst also ein free(x) einbauen nachdem du x nicht mehr brauchst, das wäre nach der for-Schleife Zeile 22/23.

    In der main kannst du x nicht mehr freigeben, weil x nur in harmonisches_mittel definiert ist und danach weg ist.

    Wenn du es freigibst und danach noch einmal benutzt stürzt dein Programm meistens ab.

    Es ist ein bischen üblich sowas wie free(pointer); pointer = 0; zu schreiben. Nachdem der Speicher für pointer freigegeben wurde zeigt er auf Speicher auf den du nicht mehr zugreifen darfst, und Zeiger die nirgendwo hinzeigen lässt man üblicherweise auf 0 oder NULL zeigen.

    Edit: Was soll denn Zeile 29 tun? Du musst anz schon eine Zahl zuweisen, du möchtest nicht dass malloc zufällig viel Speicher anfordert.



  • das sieht doch wieder so aus, also würde es ohne malloc/free gehen. warum immer diese malloc-wut?
    🙂



  • ahhh okay jetzt klingelst, sprich ich baue das free ein und erstelle einen variable pointer, die auf wert NULL zeigt

    also baue ich 2 free ein

    einmal free(x) und darunter free(pointer) oben deffiniere ich dann int pointer = 0; verstehe ich das richtig.

    zeile 29 habe ich nur erstellt damit meine Funktionsrumpf in die main funtion mitgenommen wird. Oder hätte float(int anz) gereicht ? ahh du meinst int anz = 0 wäre da sinvoller gewesen wegen den malloc.

    schreibe ich es dann so als if anweisung ?
    if(px != NULL)
    free(x);

    @ fricky

    warum , ganz einfach, damit ich es lerne 😃 sonst sitz ich mal dran lese malloc und kratz mich am kopf was da ist, mmm von früher wäre es ein pole gewesen der hies mark mallok 😃 was für ein zufall.

    ich hätte ja auch array[20] machen können und mir so die Werte holen können.



  • timeisup schrieb:

    ich hätte ja auch array[20] machen können und mir so die Werte holen können.

    ^^ naja, ich könnte wetten, dass es ohne array und ohne 'malloc' geht.
    🙂



  • 😃 ich wette nicht , ist alles noch recht neu, aber wie würdest du es machen ?



  • timeisup schrieb:

    😃 ich wette nicht , ist alles noch recht neu, aber wie würdest du es machen ?

    direkt nach der eingabe jeder zahl: summe=summe + 1/neuer_wert; und am schluss: return anz/summe;
    🙂



  • Die Funktion malloc erwartet die Anzahl der benötigen Bytes. Du reservierst zu wenig Speicher. Float hat 4 Bytes, du reservierst also für jeden Wert 3 Bytes zu wenig.
    Um Speicherlecks zu vermeiden, muss dieser wieder mit free freigegeben werden.
    Und: deine for Schleifen solltest du entknoten.

    float* x = malloc ( anz * sizeof(float) );
    if ( x == NULL ) {/* Fehlerbehandlung, ... */}// malloc ist fehlgeschlagen.
    // ...
    free(x);
    

Anmelden zum Antworten