Absturz bei free()



  • Ich habe ein Programm geschrieben, welches mit Hilfe einer Ringliste ein Rätsel lösen soll. (Im Code steht die Beschreibung dazu)
    Es funktioniert auch ganz gut und macht das was es machen soll, nur leider stürzt es nach der Ausführung immer ab. Ich denke das passiert, wenn es versucht den Speicher wieder freizugeben.
    Leider verstehe ich nicht wieso und wie ich das Problem beheben kann. Ich glaube ich habe den dynamischen Speicher irgendwie immer noch nicht ganz verstanden...

    #include <stdio.h>
    #include <stdlib.h>
    
    struct ringlistelement
    {
        int val;
        struct ringlistelement *next;
    };
    
    void ausgabe(struct ringlistelement *start)
    {
        struct ringlistelement *i;
        i=start;
        printf("\n\n");
        for(;;)
        {
            printf("%d", i->val);
            i = i->next;
            if(i == start)
                break;
            printf(", ");
        }
    }
    
    void verkettung(struct ringlistelement *element1, struct ringlistelement *element2)
    {
        element1->next = element2;
    }
    
    struct ringlistelement *aussortieren(struct ringlistelement *start, int raus)
    {
        struct ringlistelement *rausnehmen=start, *vorgaenger;
        int i;
        for(i=1; i<raus; i++)
        {
            vorgaenger =rausnehmen;
            rausnehmen = rausnehmen->next;
        }
        vorgaenger->next = rausnehmen->next;
        printf("%d, ", rausnehmen->val);
    
        return rausnehmen->next;
    }
    
    int main()
    {
        printf("Im Jahre 67 n. Chr. wurde die galil%cische Stadt Jotapata nach\n"
                "47t%cgiger Belagerung von Kaiser Vespasian eingenommen.\n"
                "Josephus, der Anf%chrer des Widerstands, und 40 Soldaten wollten\n"
                "nun, um der Sklaverei zu entgehen, sich selbst umbringen;\n"
                "Josephus beschwor sie vergebens, davon abzulassen. Damit er\n"
                "wenigstens seinen Freund und sich selbst rette, schlug Josephus\n"
                "als T%ctungsritual die decimatio (Aussonderung jedes Zehnten)\n"
                "vor. An welche Stelle des Kreises\n"
                "stellte er seinen Freund und sich, um zu %cberleben?\n\n", 132, 132, 129, 148, 129);
    
        int anzahl, aussort, i;
        struct ringlistelement *ringliste, *start;
        printf("Wie viele Personen?\n");
        scanf("%d", &anzahl);
        printf("Der wievielte soll aussortiert werden?\n");
        scanf("%d", &aussort);
    
        ringliste = (struct ringlistelement *) calloc(anzahl, sizeof(int));
    
        if(ringliste == NULL)
        {
            printf("FEHLER BEIM ALLOKIEREN!\n");
            return EXIT_FAILURE;
        }
    
        for(i=0; i<anzahl; i++)
        {
            ringliste[i].val = i+1;
        }
    
        for(i=0; i<anzahl-1; i++)
        {
            verkettung(&ringliste[i], &ringliste[i+1]);
        }
    
        verkettung(&ringliste[anzahl-1], &ringliste[0]);
    
        ausgabe(&ringliste[0]);
    
        printf("\n\n");
    
        start= aussortieren(&ringliste[0], aussort);
    
        for(i=0;i<anzahl-3;i++)
        {
            start=aussortieren(start, aussort);
        }
    
        printf("\n\nSie m%cssten an folgenden Stellen stehen:", 129);
    
        ausgabe(start);
    
        if(ringliste != NULL)
        {
            free(ringliste);
        }
    
        return EXIT_SUCCESS;
    }
    


  • Du forderst zuwenig Speicher an.
    Deine struct ringlistelement braucht mehr Speicher als ein int



  • Ich habs auch grad selbst gemerkt.
    Aber trotzdem vielen Dank!
    Echt ein dummer Fehler und ich hab ewig gebraucht um den zu finden 😞



  • Du musst lernen anständig zu debuggen.


Log in to reply