Andreas Pflug: (C) seltsamer calloc-Fehler + Pointerfragen

Beitrag lesen

Hallo,

Trotzdem steckt hier ein Bug: falls strlen(s) == MAX, wird das Null-Endzeichen von s 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