Hallo,
Trotzdem steckt hier ein Bug: falls
strlen(s) == MAX
, wird das Null-Endzeichen vons
nicht mitkopiert und*c
ist nur dann korrekt terminiert, falls zufälligerweise(*c)[len] == 0
.Statt
strncpy(*c, s, len)
sollte besser
memcpy(*c, s, len);
(*c)[len] = 0;
> verwendet werden.
Stimmt und danke für Deinen Hinweis!
Das Problem tritt auch bereits dann auf, wenn
man erst einen längeren und danach einen kürzeren
String an die selbe Stelle schreibt. Man kann
dem allerdings schon abhelfen, indem man
`strncpy(*c, s, len+1)`{:.language-c}
schreibt, da ich ja ohnehin len+1 bytes alloziere und
bei char \*s davon ausgegangen werden kann,
dass dieser String mit einem Null-Charakter endet (falls
nicht, dann ...)).
> void kill\_metadata(struct metadata \*m)
> {
> free(m->bezeichnung);
> free(m->zusatzinfo);
> free(m);
> }
Damit würde meine main-Routine beim Beenden
eine "double free or corruption"-Meldung oder ähnliches spucken,
mit dem von Dir geschilderten Konzept
ist das natürlich konsistent.
Programmieren in "objektorientiertem C" ist allerdings etwas, das
ich mir nicht im Übermaß antun will ;-).
Vielleicht findet sich noch jemand, der eine
Version des Codes in State-of-the-Art-C++ postet?
MfG
Andreas