POINTER dan ALOKASI MEMORI


Seperti dibahas pada topik POINTER dan ARRAY, bila kita ingin memfungsikan pointer sebagaimana suatu ARRAY maka kita harus mengalokasikan memori sesuai ukuran yang kita ingini. Inilah kelebihannya, kita mampu mengalokasikan memori sesuai kebutuhan kita.

Contoh kasus:

Kita ingin mengambil data pixel suatu gambar, kemudian kita menyimpannya ke buffer (penampung sementara) untuk diolah. Bagaimana kita mendefinisikan ukuran array bila ukuran gambar bermacam-macam?

Perlu diingat jumlah array harus didefinisikan dahulu sebelum, dipakai !

Apabila ukuran array lebih kecil dari yang kita gunakan, maka akan menyebabkan segmentation fault (banjir).

Menggunakan Array yang super besar? Bagaimana jika yang kita load ternyata ukurannya kecil? Tentu memboroskan memori.

Mengatur ukuran gambar agar fix? Tentu program kita menjadi tidak portable! Serta perlu editor gambar.

Solusi:

Kita gunakan alokasi memori dinamis! Dinamis? Ya! Karena kita dapat mengalokasikan dimana saja, berapa saja serta dapat didealokasikan kapan saja agar dapat dipakai untuk yang lain.

Apa perbedaan memori dinamis dan statis (Array)?

Memori dinamis telah djelaskan diatas, sedangkan array alokasi dan dealokasi dilakukan oleh kompiler, jumlah alokasi sudah tetap sebesar saat kita mendefinisikan Array di awal program.

OK! Algorithma pemecahan masalah diatas:

Inisialisasi pointer

Load File Image

Dapatkan ukuran Image beserta pixelnya.

Alokasikan memori sebesar ukuran pada step 3, tunjuk pointer ke alamat memori yang dialokasikan ini.

Proses Image.

Apabila proses telah selesai dan alamat memori diatas sudah tidak dipakai, maka de-alokasikan alamat memori dari step 4. Agar bisa digunakan untuk yang lain.

Proses dealokasi penting dilakukan untuk meningkatkan performa, serta menghindari “out of memory”.

Cara mengalokasi memori salah satunya adalah menggunakan fungsi malloc seperti yang didefinisikan pada file stdlib.h:

(void *)malloc(size_of_memory_yang_dialokasikan)

Contoh program Pointer , Array dan alokasi memori dinamis.

#include

#include

int main()

{

int *X;

int *posAwal;

int i;

X = (int *)malloc(10*sizeof(int)); // alokasi memori sebesar 10 *4 byte.

// Identik dengan X[10] pada Array

posAwal = X; // simpan posisi awal X ke posAwal (agar tidak tersesat)

/* Dengan Array */

for(i=0;i<10;i++)

X[i] = i;

for(i=0;i<10;i++)

printf(“X[%d] = %d”,i,X[i]);

/* Dengan Pointer */

for(i=0;i<10;i++)

*X++ = i *10;

X = posAwal; // kembalikan posisi awal X

for(i=0;i<10;i++)

printf(“*X = %d”,*X++);

free(X); //bebaskan memori X

}

Pada program diatas, saat menggunakan pointer sebaiknya kita menyimpan posisi awal dari memori yang ditunjuk, agar tidak terjadi kasus seperti pada pembahasan POINTER dan ARRAY

3 komentar:

  1. thanks makasih bgt udh kasih tutornya
    cakdarwis.blogspot.com

    BalasHapus
  2. Jelas banget gan pembahasannya, thanks banget ilmunya bermanfaat

    BalasHapus
  3. akhirnya aku menemukanmu,setelah buka sini buka situ penjelasannya tntng malloc gak bsa di cerna , thx gan ..the best!!

    BalasHapus