strcpy
fügt ein Null-Terminatorzeichen '\0'
hinzu . Sie haben vergessen, Platz dafür zuzuweisen:
*filename = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);
Sie müssen Platz für 5 Zeichen hinzufügen:4 für ".tde"
Suffix und ein weiteres für '\0'
Terminator. Ihr aktueller Code weist nur 4 zu, sodass der letzte Schreibvorgang in den Bereich unmittelbar nach dem Block erfolgt, den Sie für den neuen Dateinamen zugeordnet haben (d. h. 0 Bytes danach).
Hinweis: Ihr Code hat ein allgemeines Problem - er weist die Ergebnisse von realloc
zu direkt zu einem Zeiger, der neu zugewiesen wird. Dies ist in Ordnung, wenn realloc
ist erfolgreich, erzeugt aber ein Speicherleck, wenn es fehlschlägt. Um diesen Fehler zu beheben, muss das Ergebnis von realloc
gespeichert werden in einer separaten Variablen und überprüfen Sie sie auf NULL
bevor der Wert *filename
wieder zugewiesen wird :
char *tmp = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);
if (tmp != NULL) {
*filename = tmp;
} else {
// Do something about the failed allocation
}
Direkte Zuordnung zu *filename
erzeugt ein Speicherleck, weil der Zeiger *filename
auf die unten gezeigt wurde, würde bei einem Fehler überschrieben und wäre nicht wiederherstellbar.