M
c_newbie schrieb:
typedef struct liste{ //<-- typedef, dann auch ...
int *daten;
struct liste *l_next;
} // <-- name angeben!!!
Wenn wir dass ganze nun umdrehen und in einem zu kleinen Zeiger einen zu großen Speicherbereich "ablegen" könnten doch keine Daten mehr überschrieben werden?
Funktioniert in so einem Fall free(*Z) noch?
Jein, du kannst immer noch über den von dir allozierten Bereich zugreifen,
aber dafür musst der Programmierer sorgen, dass es nicht passieren kann.
In dem anderen Fall ist es einfach nur falsch, bzw. macht es einfach keinen
Sinn.
Es gilt immer: Bei einem Zugriff auf eine Speicherstelle, musst du dir sicher
sein, dass du den Speicher angelegt hast und du auch drauf zugreifen darfst.
Zu deiner zweiten Frage: Ja, das funktioniert, da malloc() sich die Größe
speichert!
Vielleicht solltest du mal über folgenden Typen nachdenken:
struct liste{
void *daten; // <-- void*
struct liste *l_next;
}
Damit ist der Typ der Daten dem Benutzer überlassen. Und der Benutzer
muss sich darum kümmern, dass die Daten alloziert und wieder freigegeben
werden. Die Liste kümmert sich nur um die Aufbewahrung der Daten.
Üblicherweise schreibt man Funktionen wie:
struct liste * add (struct liste *l, void *daten);
void * get_first(struct liste *l, struct liste **cur);
void * get_next(struct liste **cur);
Gruß mcr