Problem mit der Funktion free()



  • Hallo,
    Ich bin ein C-Neuling und wollte etwas mit Pointern und Listen probieren.
    Folgendes Programm hab ich bisher:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct number {
        int wert;
        struct number *nnext;
    }number;
    
    void showAll(number *lauf) {
    	 while(1) {
    		printf("Wert: %i\n", lauf->wert);
    		if(lauf->nnext == NULL) {
    		    printf("Ende.\n");
    		    break;
    		}
    		lauf = lauf->nnext;
         }
         return;
    }
    
    void deleteAll(number *lauf) {
    	 while(1) {
             free(lauf);
             if(lauf->nnext == NULL) break;
             lauf = lauf->nnext;
    	 }
    	 printf("Alle Elemente wurden geloescht.\n");
    	 return;
    }
    
    number* insertE(number *nstart) {
        number *n;
        n = (number*)malloc(sizeof(number));
        printf("Bitte geben Sie einen Integer Wert ein:");
        scanf("%i", &n->wert);
        fflush(stdin);
        n->nnext = nstart;
        nstart = n;
        return nstart;
    }
    
    int main(void) {
    	number *nstart = NULL;
    	int a;
    	while(1) {
    	    printf("Funktionen:\n");
    	    printf("[1] Element einfuegen\n");
    	    printf("[2] Elemente anzeigen\n");
    	    printf("[0] Programm beenden\n");
    	    scanf("%i", &a);
    	    fflush(stdin);
    	    if(a == 1) nstart = insertE(nstart);
    	    if(a == 2) if(nstart) showAll(nstart);
                       else printf("Keine Elemente vorhanden.\n");
            if(a == 0) break;
        }
        if(nstart) deleteAll(nstart);
    	system("Pause");
    	return 0;
    }
    

    Ich kann Elemente einfügen und anzeigen lassen. Das funktioniert soweit.
    aber wenn das Programm beendet wird will ich mit der Funktion deleteAll()
    alle Einträge löschen. Aber er stürzt bei der funktion free() ab. bzw bleibt in einer schleife hängen...wenn ich "//" vor "free(lauf)" setze funktioniert es. Also kommt er aus der Schleife raus.

    Wer kann mir helfen ?
    Ich danke schon mal 😉
    Viele Grüße



  • Weil zuerst "lauf" freigibst und dann auf ein Element von "lauf" zugreifst:

    void deleteAll(number *lauf)
    {
        number *temp,
               *current;
    
        current = lauf;
        while(current != NULL)
        {
             temp = current;
             current = current->nnext
             free (temp);
         }
         printf("Alle Elemente wurden geloescht.\n");
         return;
    }
    


  • Ahh...:)
    Danke...endlich gehts wie ich mir das vorgestellt habe!


Anmelden zum Antworten