[C] Speicher für Liste mit all ihren Elementen wieder freigeben

InfDude

Cadet 4th Year
Registriert
Apr. 2016
Beiträge
95
Guten Tag, wieder einmal eine Anfängerfrage
undzwar will ich in einem Programm den Speicher, der für eine Liste und ihre Elemente mit malloc reserviert wurde, wieder freigeben. Dazu hab ich eine Funktion void free_list(list* alist)

Mein Code für diese Funktion sieht aus wie im angehängten Bild, funktioniert aber nicht, da "next" kein Element von list sei. Fehlermeldungen auch im Anhang. Die beiden Warnings sind ja nicht weiter wild, auch wenn ich die 2. nicht nachvollziehen kann, da in der Funktion nur 2 geschweifte Klammer sind, eine auf eine zu..

Was könnte falsch sein? "next" benutze ich überall in der Funktion, da die Liste mit ständiger Pointerweitergabe (next) aufs nächste Element erstellt wird. Valgrind markiert mir auch, dass irgendwas nicht gemalloc'd oder gefree'd wurde. Der gesamte Programmcode ist zu lang um ihn hier zu posten, wenn irgendwas unklar ist/benötigt wird, einfach fragen. (Bin noch ziemlicher Anfänger, also entschuldigt mich, wenn ich irgendwelche offensichtlichen Sachen vergessen habe zu erwähnen oder sowas..)
 

Anhänge

  • Free.jpg
    Free.jpg
    37,2 KB · Aufrufe: 418
  • Fehlr.jpg
    Fehlr.jpg
    103,9 KB · Aufrufe: 418
Ich würde mal vermuten das in deiner Struktur list kein Element mit dem namen next vorhanden ist. Kannst du die Deklaration der Struktur list anhängen?

Die beiden Warnings gehören offensichtlich nicht zu dem von dir geposteten Code. Dein Code scheint um Zeile 85 herum zu sein, die beiden anderen Warnings aber bei Zeile 133 und 55. Das zweite Warning bedeutet das in einer Funktion die nicht void als return Typ hat ein return fehlt.
 
Wenn ich richtig verstanden habe, ist der code im Anhang. Geschrieben wird die Liste, indem Elemente aus einer Datei ausgelesen werden.
Mit "Next" wollte ich eigentlich nur , dass der Pointer zum nächsten Element gegeben wird und das jeweils vorherige gelöscht wird. So hab ich das Prinzip jedenfalls verstanden. Wie soll ich sonst vorgeben, wenn ich nur diesen einen Parameter habe, irgendwie muss ich mich doch durch die Liste durcharbeiten und jedes Element free'n?
 

Anhänge

  • Liste.jpg
    Liste.jpg
    47,1 KB · Aufrufe: 301
Nein, du hast mich nicht verstanden. Ich wollte die Deklaration/Definition deiner Listen-Struktur. Diese müsste in etwa wie folgt aussehen
Code:
struct list {
  int data;
  struct list* next;
};
Das Prinzip hast du richtig verstanden. Aber was dir dein Compiler sagt ist: Es gibt kein next in der Deklaration deiner Struktur list. Sie sieht also so aus:
Code:
struct list {
  int data;
};
Da kann er dann natürlich auf auf next nicht zugreifen. Es gibt ja schließlich kein next.

Bitte hänge die relevanten Code-Ausschnitte an, oder falls das zu kompliziert ist einfach den ganzen.
 
Zuletzt bearbeitet:
Poste doch bitte einfach den ganzen Code. Es gibt nichts nervigeres als Rätselraten was du möglicherweise gemeint haben könntest, wenn du beschrieben hast, wie du etwas umgesetzt hast.
Es gibt CODE und SPOILER Tags hier, damit kannst du problemlos sehr langen Code posten.
Einfach das Keyword mit eckigen Klammern umgeben: [KEYWORD]Was du posten willst kommt hier hin.[/KEYWORD] und statt KEYWORD einfach CODE oder SPOILER.
Wenn du einen CODE-Block in einen SPOILER-Block packst kannst du sehr langen Code posten ohne das Forum zu sprengen. zB:

Code:
void veryLongCodeHere( ... );

Gruß
BlackMark
 
Ich werde die ganzen Variablen nicht aufschreiben sondern mit ".." abkürzen. Aufgeschrieben habe ich immer nur die ersten und pointer.

Code:
struct _element {
 
    char title[255];
    char author[255];
    ..
    ..
    element* next;
    };




Das erste Element wird wie folgt ausgelesen:

Code:
element *insert_at_begin(element *first, element *new_elem) {
   strcpy(first->title, "Titel");
   strcpy(first->author, "Autor");
   ..
   ..
   first->next=new_elem;
   return new_elem;

}

Ich sollte das erste Element einfügen und einen Pointer zurückgeben der aufs nächste element zeigt, ab da werden dann alle aus einer Datei ausgelesen (mithilfe von vorgegebener Funktion)


Mein construct:

Code:
 construct_element(char *title, char*author, .., ..){
    element *object=(element*)malloc(sizeof(element));
    strcpy(object->title, title);
    strcpy(object->author, author);
    ..
    ..
    object->next=NULL;
    return object;

}


Mein free:

Code:
void free_list(list *alist){

   list*temp=alist;
   while(temp!=NULL)  {
   list *temp2=temp;
   temp=temp->next;
   free(temp2);
}


Hier nochmal wie das construct_list aussieht:

Code:
list* construct_list() {
   list *alist=malloc(sizeof(list));
   alist->first=NULL;
   alist->count=0;
   return alist;
}


construct_list, sowie void read_list und void print_list sind mir vorgegeben, die kann ich nicht ändern.. Also alles was in der main steht ist unveränderlich. Der Fehler muss irgendwo bei den von mir implementierten Sachen sein..
 
Willst du, dass dir geholfen wird oder nicht?
Wenn ja, dann poste den gesamten Code, nämlich den, den du versuchst zu kompilieren. Nicht eine Skizze davon. Woher sollen wir denn jetzt wissen, ob du beim Skizzieren aus "_element" auf einmal "element" gemacht hast, oder ob das schon im originalen Code so ist. Oder ob die Klammer bei free_list nur abgeschnitten wurde, oder in deinem Code wirklich fehlt. Oder das was Sakphul schon angesprochen hat: Was ist list? Wo ist das definiert, wie ist es definiert?

Edit:
Außerdem solltest du deine Hausaufgaben sowieso selber machen. Google ist dein Freund und so schwer ist das alles nicht.

Gruß
BlackMark
 
Zuletzt bearbeitet:
Zusätzlich zu dem was BlackMark gesagt hat noch eine Ergänzung. Bitte benutze immer strncpy die Variante strcpy kann bei eine char Array zu einem Überlauf des Arrays führen und ein Sicherheitsproblem sein.
 
Mach es dir und uns einfacher und zeige bitte den gesamten Code. Es fehlt immer noch zu vieles oder beinhaltet Tippfehler von dir. Ansonsten kann dir niemand helfen. Das Nachfragen hat sich als nicht Sinnvoll erwiesen da dir die Begriffe noch nichts sagen/bzw. du die Rückfragen noch nicht verstehst.
 
Zurück
Oben