realloc()
Mengubah ukuran memori yang sudah dialokasikan dalam C
Fungsi realloc()
digunakan untuk mengubah ukuran blok memori yang telah dialokasikan sebelumnya dengan malloc()
atau calloc()
.
Jika ukuran baru lebih besar, maka blok baru bisa dialokasikan, dan data lama tetap dipertahankan.
Sintaks
void *realloc(void *ptr, size_t new_size);
ptr
➜ Pointer ke blok memori yang sebelumnya dialokasikan denganmalloc()
ataucalloc()
.new_size
➜ Ukuran baru (dalam byte) yang ingin dialokasikan.Mengembalikan pointer ke blok memori yang telah diperbesar/diperkecil.
Jika gagal, mengembalikan
NULL
, tetapi memori lama tetap ada.
Contoh Penggunaan
1. Menambah ukuran array dinamis
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int n = 3;
// Alokasi awal untuk 3 elemen
arr = (int*) malloc(n * sizeof(int));
if (arr == NULL) {
printf("Alokasi awal gagal!\n");
return 1;
}
// Mengisi nilai awal
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
// Menampilkan array sebelum realloc
printf("Array sebelum realloc: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// Menambah ukuran array menjadi 5 elemen
n = 5;
arr = (int*) realloc(arr, n * sizeof(int));
if (arr == NULL) {
printf("realloc gagal!\n");
return 1;
}
// Mengisi elemen tambahan
for (int i = 3; i < n; i++) {
arr[i] = i + 1;
}
// Menampilkan array setelah realloc
printf("Array setelah realloc: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
free(arr); // Bebaskan memori
return 0;
}
Hasilnya:
Array sebelum realloc: 1 2 3
Array setelah realloc: 1 2 3 4 5
malloc(3 * sizeof(int))
➜ Mengalokasikan 3 elemen.realloc(arr, 5 * sizeof(int))
➜ Ukuran array bertambah menjadi 5.Data lama tetap dipertahankan, elemen tambahan bisa diisi setelah
realloc()
.free(arr)
➜ Membebaskan memori setelah digunakan.
2. Mengurangi ukuran blok memori
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int n = 5;
// Alokasi awal untuk 5 elemen
arr = (int*) malloc(n * sizeof(int));
if (arr == NULL) {
printf("Alokasi awal gagal!\n");
return 1;
}
// Mengisi array
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
// Menampilkan array sebelum realloc
printf("Array sebelum realloc: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// Mengurangi ukuran array menjadi 3 elemen
n = 3;
arr = (int*) realloc(arr, n * sizeof(int));
if (arr == NULL) {
printf("realloc gagal!\n");
return 1;
}
// Menampilkan array setelah realloc
printf("Array setelah realloc: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
free(arr); // Bebaskan memori
return 0;
}
Hasilnya:
Array sebelum realloc: 1 2 3 4 5
Array setelah realloc: 1 2 3
malloc(5 * sizeof(int))
➜ Mengalokasikan 5 elemen.realloc(arr, 3 * sizeof(int))
➜ Ukuran dikurangi menjadi 3, elemen4
dan5
dihapus.Data yang tersisa tetap valid.
3. Penanganan jika realloc() gagal
Jika realloc()
gagal (tidak bisa mengalokasikan memori tambahan), maka pointer lama tetap ada dan program tidak crash.
Untuk menghindari kehilangan data, gunakan pointer sementara:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr, *temp;
int n = 3;
arr = (int*) malloc(n * sizeof(int));
if (arr == NULL) {
printf("Alokasi awal gagal!\n");
return 1;
}
// Isi array
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
// Simpan pointer lama
temp = realloc(arr, 5 * sizeof(int));
if (temp == NULL) {
printf("realloc gagal, tetap gunakan pointer lama!\n");
} else {
arr = temp; // Perbarui pointer jika realloc berhasil
n = 5;
}
// Bebaskan memori
free(arr);
return 0;
}
Jika
realloc()
gagal, pointerarr
tidak akan berubah, dan memori lama tetap tersedia.
Last updated