strcpy
menambahkan karakter null terminator '\0'
. Anda lupa mengalokasikan ruang untuk itu:
*filename = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);
Anda perlu menambahkan spasi untuk 5 karakter:4 untuk ".tde"
akhiran, dan satu lagi untuk '\0'
terminator. Kode Anda saat ini hanya mengalokasikan 4, jadi penulisan terakhir dilakukan ke ruang segera setelah blok yang telah Anda alokasikan untuk nama file baru (yaitu 0 byte setelahnya).
Catatan: Kode Anda memiliki masalah umum - kode memberikan hasil realloc
langsung ke pointer yang sedang dialokasikan kembali. Ini bagus ketika realloc
berhasil, tetapi membuat kebocoran memori saat gagal. Memperbaiki kesalahan ini memerlukan penyimpanan hasil dari realloc
dalam variabel terpisah, dan memeriksanya untuk NULL
sebelum menetapkan nilai kembali ke *filename
:
char *tmp = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);
if (tmp != NULL) {
*filename = tmp;
} else {
// Do something about the failed allocation
}
Menetapkan langsung ke *filename
membuat kebocoran memori, karena penunjuk *filename
telah menunjuk ke bawah akan ditimpa jika gagal, menjadi tidak dapat dipulihkan.