Showing posts with label C. Show all posts
Showing posts with label C. Show all posts

Tuesday, October 23, 2012

Iseng- "Memory Allocations"

Dalam dunia pemrograman, kita diizinkan untuk mengalokasikan ruang memory secara dinamis pada saat program berjalan sesuai dengan kita butuhkan, proses seperti ini dinamakan dengan alokasi memory dinamis (dynamic memory allocation). Sedangkan pada saat kita mendekalarikan variabel global maupun lokal di dalam kode program yang kita tulis, kompilaor secara otomatis akan memesan sejumlah ruang memory untuk menampung variabel tersebut, proses seperti ini disebut dengan alokasi memory statis (static memory allocation).

Untuk melakukan alokasi memory secara dinamis dibutuhkan pointer untuk mencata alamat-alamat baru yang dipesan. Bahasa C telah menyediakan fungsi-fungsi yang digunakan untuk proses pemesanan memory secara dinamis tersebut, yaitu fungsi malloc(), calloc(), dan realloc(). 


Fungsi malloc()
Fungsi ini mempunyai bentuk prototype seperti terlihat di bawah :

void * malloc(size_t n)

Fungsi malloc() akan mengembalikan pointer ke sejumlah n byte ruang memory yang belum diinisialisasi. Apabila tidak terpenuhi, maka fungsi ini akan mengembalikan nilai NULL. Hal yang perlu diperhatikan dalam  menggunakan fungsi ini adalah kita harus melakukan typecasting terhadap pointer yang akan dipesan sesuai dengan tipe data yang diinginkan. Perhatikan contoh penggunaan fungsi malloc di bawah ini :

int array[10];
int *p;
p = (int *) malloc(10 * sizeof(int));

Sintak ini artinya melakukan pemesanan atau mengalokasikan ruang memory sebanyak 40 byte (berasal dari 10x4) untuk menyimpan data yang bertipe int dan mencatat ruang memory tersebut ke dalam pointer p. Adapun nilai 4 di sini berasal dari ukuran tipe data int yaitu 4 byte. Jadi apabila kita ingin mengalokasikan ruanng memory untuk tipe data double, sedangkan kita telah mengetahui bahwa tipe data double berukuran 8 byte, maka kita dapat menuliskannya sebagai berikut :

double *p;
p =  (double*) malloc(8); 
/* atau dapat juga dituliskan p = (double*) malloc(sizeof(double)); */

Meskipun cara di atas dizinkan oleh kompilator serta program juga dapat berjalan dengan benar, namun kebanyakan dari programmer C pada umumnya lebih memilih untuk menggunakan operator sizeof untuk mendapatkan ukuran dari tipe data tertentu.

Fungsi calloc()
Fungsi ini mempunyai bentuk prototype sebagai berikut :

void *calloc(size_t n, size_t size);

Fungsi calloc() akan mengembalikan pointer ke sebuah array yang terdiri dari n elemen data dengan size yagn ditentukan. Apabila tidak terpenuhi, maka fungsi ini akan mengembalikan nilai NULL. Berbeda dengan fungsi malloc() yang tidak melakukan inisialisasi, pada fungsi calloc() ini ruang yang dialokasikan akan diinisialisasi dengan nilai nol. Untuk dapat lebih memahaminya, perhatikan contoh potongan kode program di bawah untuk penggunaan fungsi calloc().

int *p;
p = (int*) calloc(20, sizeof(int));

Sintak tersebut mengalokasikan 80 byte ruang memory (yang berasal dari 20x4). Dengan kata lain, terdapat 20 element array yang masing-masing elemennya berukuran 4 byte. Sama seperti sebelumnya, nilai 4 byte disini adalah ukuran dari tipe data int.


Fungsi realloc()
Fungsi terakhir yang dapat digunakan untuk mengalokasikan memory dalam bahasa C adalah realloc(). Prototype fungsi ini seperti terlihat di bawah :

void *realloc(void *p, size_t size)

Perlu ditekankan bahwa fungsi realloc() ini sebenarnya digunakan untuk melakukan perubahan terhadap alokasi memory yang sebelumnya telah dilakukan dengan menggunakan fungsi malloc() atau calloc(). Dengan kata lain, fungsi ini hanya digunakan untuk alokasi ulang apabila ternyata ruang yang dialokasikan oleh fungsi malloc() atau calloc() kurang besar. Fungsi realloc() ini akan mengembalikan pointer ke ruang baru yang ditambahkan, atau mengembalikan nilai NULL apabila permintaan ruang tersebut tidak terpenuhi. Berikut ini contoh penggunaan fungsi realloc() untuk menambahkan ruang memori yang telah dialokasikan.

int *p;
p = (int*) calloc(10, sizeof(int)); //memesan ruant 40 byte
realloc((int*) p, 80);//memesan ruang sebanyak 40 byte lagi, sehingga sekarang menjadi 80 byte



Nah... ! Untuk menghidari adanya pemborosan memory ataupun terjadinya memory leak (kebocoran memory), maka sebaiknya kita melakukan dealokasi terhadap ruang-ruang memory yang telah sebelumnya dialokasikan melalui fungsi malloc(), calloc(), ataupun realloc(). Dalam bahasa C, proses ini akan dilakukan dengan menggunakan fungsi free() yang memiliki parameter bertipe pointer. Prototype fungsi free() ini seperti terlihat di bawah :

void *free(void *p)

p didalam parameter fungsi free tersebut haruslah bertipe pointer. Contoh penggunaannya seperti terlihat di bawah :

int *p;
p = (int*) malloc(sizeof(int));
.....
.....
....
free(p);