Modul 5 : Dynamic Allocation Function - IvanSholana/Algoritma-dan-Struktur-Data GitHub Wiki
Seperti yang dijelaskan pada modul sebelumnya bahwa untuk melakukan pengalokasian menggunakan alokasi memori dinamis maka digunakan beberapa built-in Function. Function function tersebut antara lain adalah malloc()
,calloc()
,realoc()
,free()
. Adapun seluruh dari fungsi tersebut disimpan pada library <stdlib.h>
.
Malloc malloc()
atau singkatan dari memory allocate adalah fungsi yang digunakan untuk melakukan alokasi sebuah blok memori dengan besar memori yang telah ditentukan pada heap memory layout.
Adapun untuk mendeklarasikan atau menggunakan malloc dapat mengikuti kode program berikut:
tipe_data *variabel = (tipe_data*)malloc(n * sizeof(tipe_data));
Dapat dilihat pada kode program di atas, untuk menggunakan malloc maka malloc tersebut harus diassigmentkan terhadap sebuah variabel pointer. Hal tersebut dikarenakan fungsi malloc memberikan nilai kembalian berupa alamat memori pertama dari blok memori yang dialokasikan. Kemudian beralih pada bagian (tipe_data*)
, pada bagian tersebut dilakukan casting tipe data. Hal tersebut dilakukan karena nilai yang dikembalikan oleh malloc adalah alamat memori atau sebuah void pointer, hal itu dikarenakan malloc tidak mengetahui untuk data jenis apa sebuah blok memori itu dialokasikan, untuk itu malloc perlu dilakukan casting. Terakhir pada bagian (n * sizeof(tipe_data))
, pada bagian ini dideklarasikan besar dari blok memori yang diinginkan. Penggunaan sizeof sendiri dikarenakan setiap besar jenis tipe data yang diinginkan pada setiap device berbeda sehingga dengan menggunakan sizeof maka ukuran data tersebut akan menyesuaikan dengan devicenya masing masing. Jika terjadi suatu error semisal memori sudah penuh dan malloc gagal dilakukan, maka malloc akan melakukan return null. Contoh kode program penggunaan malloc adalah sebagai berikut:
#include <stdio.h>
#include <stdlib.h>
int main(){
int *ptr = (int*)malloc(5 * sizeof(int));
for(int a = 0; a < 5; a++){
scanf("%d",ptr+a);
}
for(int a = 0; a < 5; a++){
printf("%d ",*(ptr+a));
}
}
Calloc calloc()
atau clear allocation memory merupakan fungsi yang mirip dengan malloc. Namun, terdapat 2 perbedaan yang membedakan keduanya yaitu syntax dan inisialisasi nilai. Pada calloc pendeklarasian dilakukan sebagai berikut:
tipe_data *variabel = (tipe_data*)malloc(n, sizeof(tipe_data)); // --> calloc menggunakan 2 argument, yaitu jumlah blok memori (n) dan besar tiap blok memori
Kemudian perbedaan selanjutnya adalah inisasi nilai. Pada calloc ketika memori dialokasikan maka memori tersebut akan secara otomatis memiliki nilai 0. Berbeda dengan malloc yang akan berisi nilai sampah. Berikut merupakan contoh kode program dari calloc()
:
#include <stdio.h>
#include <stdlib.h>
int main(){
int *ptr = (int*)calloc(5, sizeof(int));
for(int a = 0; a < 5; a++){
printf("%d ",*(ptr+a));
}
free(ptr);
}
Output:
0 0 0 0 0
Realloc atau realloc()
merupakan singkatan dari reallocation yaitu fungsi yang bekerja untuk melakukan perubahan besar memori (memperbesar dan memperkecil) blok memori yang telah dialokasikan sebelumnya. Dengan menggunakan realloc, seluruh value yang telah diassigmentkan kepada blok memori sebelumnya tidak akan hilang. Adapun untuk menggunakan realloc maka gunakan syntax berikut:
ptr = (tipe_data *)realloc(ptr, n * sizeof(tipe_data));
Mayoritas syntax mirip dengan fungsi - fungsi sebelumnya, yang berbeda pada bagian ptr
yang merupakan variabel pointer yang menyimpan alamat memori sebelumnya. Berikut contoh dari fungsi realloc()
:
#include <stdio.h>
#include <stdlib.h>
int main(){
int *ptr = (int*)malloc(5 * sizeof(int));
for(int a = 0; a < 5; a++){
*(ptr+a) = a;
printf("%d ",*(ptr+a));
}
printf("\n");
ptr = (int*)realloc(ptr, 10 * sizeof(int));
for(int a = 0; a < 10; a++){
printf("%d ",*(ptr+a));
}
free(ptr);
}
Output:
0 1 2 3 4
0 1 2 3 4 8716480 50331651 37024 8722808 8716480
Setelah mengalokasikan dan menggunakan suatu blok memori pada heap maka value di dalam memori tersebut tidak hilang secara otomatis. Oleh karena itu, adalah tanggungjawab kita untuk membersihkan dan membebaskan memori tersebut. Untuk membersihkan value dan membebaskan memori yang telah dialokasikan adalah dengan menggunakan fungsi free()
dengan variabel pointer sebagai parameter. Dengan menggunakan free maka nilai yang tersimpan di dalam memori tersebut akan hilang. Perhatikan contoh kode program berikut:
#include <stdio.h>
#include <stdlib.h>
int main(){
int *ptr = (int*)malloc(5 * sizeof(int));
for(int a = 0; a < 5; a++){
*(ptr+a) = a;
printf("%d ",*(ptr+a));
}
printf("\n");
free(ptr);
for(int a = 0; a < 5; a++){
printf("%d ",*(ptr+a));
}
ptr = NULL; // --> dibutuhkan karena jika tidak, maka ptr akan menjadi dagling pointer
for(int a = 0; a < 10; a++){
printf("%d ",*(ptr+a));
}
}
Output:
0 1 2 3 4
9181560 9175232 2 3 4
Pada baris pertama output yang dikeluarkan sesuai dengan nilai yang diberikan, tetapi pada baris kedua nilai yang dikeluarkan telah random. Hal tersebut dikarenakan nilai yang disimpan pada memori sebelumnya telah dibersihkan. Kemudian perhatikan bahwa tidak terdapat baris ketiga, padahal terdapat 3 buah looping pada kode program. Hal tersebut terjadi karena pada looping kedua setelah free(ptr)
yang dibersihkan adalah value di dalam memori dan pelepasan alokasi memori, tetapi value yang disimpan variabel ptr yaitu berupa alamat memori tetap tersimpan. Hal tersebutlah yang dinamakan dangling pointer. Oleh sebab itu terdapat kode ptr = NULL
. Hal tersebut berguna agar ptr tidak menjadi dangling pointer sehingga ketika dicoba diakses terjadi segmentation failure
.