Menggunakan realloc() dalam C: Sintaks, Praktik Terbaik & Contoh
Apa Itu realloc()
realloc() adalah fungsi pustaka standar C yang mengubah ukuran blok memori yang ada. Ini memperluas atau mengecilkan blok sambil mempertahankan isinya. Ini membuat manajemen memori dinamis lebih efisien, terutama saat ukuran yang diperlukan berubah selama runtime.
Sintaks
ptr = realloc(ptr, newSize);
Di sini, ptr menunjuk ke blok yang sebelumnya dialokasikan, dan newSize adalah ukuran yang diinginkan dalam byte. Setelah panggilan, ptr akan menunjuk ke byte pertama dari blok baru. Fungsi ini menyalin data asli ke lokasi baru dan membebaskan blok lama jika realokasi berhasil.
Poing Penting untuk Diingat
- Saat
realloc() berhasil, pointer yang dikembalikan dapat sama dengan asli atau alamat baru. - Jika fungsi gagal, ini mengembalikan
NULL dan membiarkan blok asli utuh. - Selalu tetapkan hasil ke pointer sementara untuk menghindari kehilangan alamat asli pada kegagalan.
- Setelah realokasi yang berhasil, bebas pointer hanya sekali.
Contoh – Mengubah Ukuran Buffer String
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char *buf = malloc(10); if (!buf) { perror("malloc"); return EXIT_FAILURE; } strcpy(buf, "Programming"); printf("%s\n", buf); char *tmp = realloc(buf, 20); // tingkatkan ukuran buffer if (!tmp) { free(buf); // blok asli masih valid perror("realloc"); return EXIT_FAILURE; } buf = tmp; strcat(buf, " in C"); printf("%s\n", buf); free(buf); return EXIT_SUCCESS; } Contoh – Mengalokasikan dan Mengubah Ukuran Array Integer
#include <stdio.h> #include <stdlib.h> int main(void) { int *arr = malloc(10 * sizeof(int)); if (!arr) { perror("malloc"); return EXIT_FAILURE; } /* ... gunakan array ... */ int *tmp = realloc(arr, 50 * sizeof(int)); if (!tmp) { free(arr); perror("realloc"); return EXIT_FAILURE; } arr = tmp; printf("Array diubah ukurannya berhasil\n"); free(arr); return EXIT_SUCCESS; } Tips Praktis
- Usi
size_t untuk argumen ukuran untuk menghindari bug terkait tanda. - Saat mengecilkan blok, waspada bahwa data di luar ukuran baru akan dibuang.
- Selalu periksa nilai kembali sebelum menggunakan pointer.
- Gunakan
free() tepat sekali untuk setiap alokasi yang berhasil.