PROBLEM: free-Befehl



  • Hallo,
    in diesem Programm hat sich eine Fehler eingeschlichen. Mal sehen wer ihn findet:

    #include "stdio.h"
    #include "stdafx.h"
    #include "stdlib.h"
    #include <Windows.h>
    #include <conio.h>
    
    struct Kettenglied_Typ
    {
    	int Inhalt;
    	struct Kettenglied_Typ*pNext;
    };
    struct Kettenglied_Typ*pAnker;	//erste Glied
    struct Kettenglied_Typ*pEnde;	//Letzte Glied
    
    void GliedAnhaengen(struct Kettenglied_Typ*pAnhang)
    {
    	struct Kettenglied_Typ*pNeuesGlied;
    	//jetzt Speicherplatz reservieren
    	pNeuesGlied=(struct Kettenglied_Typ*)calloc(1,sizeof(struct Kettenglied_Typ*));
    	pAnhang->pNext = pNeuesGlied;
    	pNeuesGlied->pNext = 0;
    }
    
    void GliedEinhaengen(struct Kettenglied_Typ *pEinfuegen)
    {
    	struct Kettenglied_Typ*pNeuesGlied;
    	//jetzt Speicherplatz reservieren
    	pNeuesGlied=(struct Kettenglied_Typ*)calloc(1,sizeof(struct Kettenglied_Typ*));
    	pNeuesGlied->pNext = pEinfuegen->pNext;
    	pEinfuegen->pNext = pNeuesGlied;
    }
    
    void GliedAusketten(int GliedNR)
    {
    	struct Kettenglied_Typ*pStart=pAnker,*pfree;
    	//jeweiliges Glied suchen
    	for(int i=1; i<GliedNR; i++)
    	{
    		if(pStart->pNext==NULL) break;
    		else 
    			pStart = pStart->pNext;
    	}
    	if(GliedNR==0){
    		pfree = pAnker;
    		pAnker = pStart->pNext;
    		}
    	else
    	{
    		pfree = pStart->pNext;
    		pStart->pNext = pStart->pNext->pNext;
    		pfree->pNext=NULL;
    	}
    	free(pfree);
    }
    
    void ListeAusgeben(struct Kettenglied_Typ*pAusgabe)
    {
    	int i=0;
    	do
    	{
    		printf("\nDer Inhalt der List %d betraegt: %d\n",i++,pAusgabe->Inhalt);
    		pAusgabe = pAusgabe->pNext;
    	}
    	while(pAusgabe->pNext!=NULL);
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	system("COLOR F5");
    	int i=0; 
    	int in=0;
    	//Speicherplatz für Anker reservieren
    	pAnker=(struct Kettenglied_Typ*)calloc(1,sizeof(struct Kettenglied_Typ*));
    	pEnde = pAnker;
    		puts("Demo fuer eine verkettete List mit 5 Elementen");
    		do
    		{
    			printf("Geben Sie einen Wert fuer Liste %d ein!",i);
    			scanf("%d", &in);
    			pEnde->Inhalt=in;
    			GliedAnhaengen(pEnde);
    			pEnde=pEnde->pNext;
    		}
    		while(++i<5);
    		ListeAusgeben(pAnker);
    		getch();
    		puts("\nKette Glied 2 aus");
    		GliedAusketten(2);
    		ListeAusgeben(pAnker);
    		getch();
    
    		puts("\nKette Glied 0 aus");
    		GliedAusketten(0);
    		ListeAusgeben(pAnker);
    		getch();
    
    		puts("\nKette Glied hinter Glied[0] ein");
    		GliedEinhaengen(pAnker);
    		ListeAusgeben(pAnker);
    		fflush(stdin);
    		getchar();
    		return 0;
    }
    


  • Bandergott schrieb:

    Hallo,
    in diesem Programm hat sich eine Fehler eingeschlichen. Mal sehen wer ihn findet:

    #include "stdafx.h"
    #include <Windows.h>
    #include <conio.h>
    

    Was hab ich jetzt gewonnen?



  • Bandergott schrieb:

    fflush(stdin);
    

    🙄



  • Bandergott schrieb:

    //Speicherplatz für Anker reservieren
    pAnker=(struct Kettenglied_Typ*)calloc(1,sizeof(struct Kettenglied_Typ*));
    

    Der Kommentar passt nicht zu dem Code.



  • Nein, es wird eine Fehlermeldung rausgeworfen:

    HEAP CORRUPRION DETECTED: after Normal block(#112) at
    0x00E343A0.
    CRT detected that the appication wrote to memeroy after end of heap
    buffer.

    Vielleicht hilft uns das ja weiter



  • Bandergott schrieb:

    in diesem Programm hat sich eine Fehler eingeschlichen. Mal sehen wer ihn findet:

    yay, ein Ratespiel! -rolleyes-



  • Bandergott schrieb:

    Nein, es wird eine Fehlermeldung rausgeworfen:

    HEAP CORRUPRION DETECTED: after Normal block(#112) at
    0x00E343A0.
    CRT detected that the appication wrote to memeroy after end of heap
    buffer.

    Ja, das kann passieren, wenn man zuwenig Speicher besorgt und dadurch über die Grenze schreibt.



  • [quote="DirkB"][quote="Bandergott"]Nein, es wird eine Fehlermeldung rausgeworfen:

    HEAP CORRUPRION DETECTED: after Normal block(#112) at
    0x00E343A0.
    CRT detected that the appication wrote to memeroy after end of heap
    buffer.[/quote]
    Ja, das kann passieren, wenn man zuwenig Speicher besorgt und dadurch über die Grenze schreibt.[/quote]

    Der Fehler entsteht aber nur wenn ich den Speicher freigebe über free(), wenn ich die Zeile auskommentiere haut der mir keine Fehlermeldung raus. Das Auskommentieren ist aber nicht zweckmäßig weil ich ja den nicht benötigten Speicher wieder freigeben möchte.



  • DirkB schrieb:

    Bandergott schrieb:

    //Speicherplatz für Anker reservieren
    pAnker=(struct Kettenglied_Typ*)calloc(1,sizeof(struct Kettenglied_Typ*));
    

    Der Kommentar passt nicht zu dem Code.

    An der Stelle (und an den anderen auch) holst du Speicher für einen Pointer (8 oder 4 Byte) und nicht für die struct (die noch das int mehr hat).



  • Bandergott schrieb:

    Nein, es wird eine Fehlermeldung rausgeworfen:

    HEAP CORRUPRION DETECTED: after Normal block(#112) at
    0x00E343A0.
    CRT detected that the appication wrote to memeroy after end of heap
    buffer.

    Vielleicht hilft uns das ja weiter

    Die Fehler stecken in der Fehlermeldung!
    1.) "Normal" sollte hier normalerweise "normal" sein.
    2.) "appication" sollte eigentlich "application" sein.
    3.) "memeroy" sollte eigentlich "memory" sein.


Anmelden zum Antworten