C Linked List - Verständnisproblem - Struct

hell-student

Lieutenant
Registriert
Nov. 2007
Beiträge
671
Hallo Zusammen,

Ich möchte gerne Daten in einer Linked List speichern und habe gerade eine Blockade. Da ich verschiedenste Daten speichern möchte, dachte ich an eine generische Liste mittels void*.

Code:
typedef struct list_node {
	void *data;
	struct list_node *next;
}list_node;

Angenommen ich habe noch eine Datenstruktur zum Speichern meiner Daten:

Code:
typedef struct car {
	int color;
	int bla;
}car;

Code:
typedef struct building {
	int color;
	int blub;
}building

Wie muss ich nun vorgehn um ein Auto einzufügen?

Muss ich vorher:
Code:
car car1 = (car)malloc(1 * sizeof(car);
machen, oder:
Code:
car car1;

Meine Frage ist nur die, wie ich alles wieder richtig freeen (free()) tue. Wenn ich ein Pointer auf ein Car in meine Liste einfüge und auf diesen Pointer free() mache, free() ich ja das Car und nicht das Element?

Ich bin gerade verwirrt :freak:

Eigentlich will ich ja nur eine Linked Liste, die generisch ist.
 
du musst erst ein free auf dein element->data ausführen, d.h.:
free( (*element).data );
 
Prinzipiell können sowohl deine list_nodes also auch deine cars auf dem Stack oder auch auf dem Heap (also via malloc) liegen. Meistens wirst du aber wohl beides auf dem Heap anlegen wollen, da sonst die Listenelemente und die Nutzdaten nur so lange leben, wie der Stackbereich, in dem sie existieren, gültig bleibt (sprich, so lange wie du in der Funktion bleibst, in der du sie angelegt hast).

Und noch was, in C sollte man den Rückgabewert von malloc() nicht casten: http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc
 
Na ja, da der OP in seinem Thread-Titel [C] schrieb, bin ich einfach mal davon ausgegangen.
 
kann dich verstehen. aber aus erfahrung würd ich nicht davon ausgehen ;)
ganz besonders nicht bei einem offensichtlichen (C-) programmieranfänger.

p.s. dennoch danke für den link. mir waren ein paar der gefahren beim casten nicht bekannt.
 
Ja stimmt schon, aber ich denke, wenn er versucht, den Code ohne cast durch einen C++-Compiler zu jagen, wird er schon ganz schnell merken, dass da was nicht paßt. ;)
 
da haste recht. aber bissle klugscheissen macht spaß. entschuldige :P
 
Zurück
Oben