Alokasi Memori Bahasa C – Pada artikel kali ini kita akan membahas cara mengalokasikan memori untuk data dinamis pada bahasa C. Alokasi memori adalah suatu proses manajemen memori yang memungkinkan program meminta atau memesan sebagian memori kepada komputer.
Ada 2 cara dalam mengalokasikan memori yaitu :
- Alokasi memori statis
- Alokasi memori dinamis.
Selengkapnya bisa di baca di : Alokasi Memori Statis dan Dinamis
Saat suatu program dijalankan, maka komputer akan mengalokasikan memori untuk program tersebut di RAM, yang terbagi menjadi empat bagian yaitu :
- Code, bagian untuk menyimpan kode
- Static, bagian untuk menyimpan variabel global atau static
- Stack, bagian untuk menyimpan variabel lokal
- Heap, bagian untuk menyimpan variabel dengan alokasi dinamis.
Bagian Code akan menyimpan kode instruksi dari program. Kemudian bagian Global, Stack, dan Heap akan menyimpan nilai dari variabel. Selengkapnya bisa di baca di : Stack Dan Heap Pada Program Komputer
Kenapa kita perlu alokasi memori dinamis pada program ?
Alokasi memori dinamis di perlukan saat kita memberikan data yang melebihi ukuran stack pada memori, hal ini disebut dengan “Stack Overflow”. Stack sendiri memiliki batasan yang sudah ditentukan oleh sistem operasi. Oleh sebab itu kita perlu mengalokasikan ke memori dinamis lalu datanya disimpan pada Heap.
Fungsi-fungsi bahasa C untuk alokasi memori
Pada bahasa C, Ada beberapa fungsi alokasi memori yang tersedia untuk mengelola memori dinamis yaitu
- malloc, mengalokasi memori tanpa mengubah isi memori yang dialokasikan.
- realloc, mengalokasikan memori dengan mengubah nilai semua memori yang dialokasikan ke nol.
- calloc, mengubah ukuran memori yang dialokasikan fungsi malloc dan calloc.
- free, membatalkan memori yang dialokasikan oleh fungsi malloc, calloc dan realloc.
Ke empat fungsi tersebut berada di header ”stdlib.h”. Jadi untuk dapat menggunakan fungsi-fungsi tersebut, maka kita harus import libary stdlib.h dengan #include.
Contoh:
#include <stdlib.h>
Mengenal Fungsi malloc()
Fungsi malloc() merupakan fungsi untuk mengalokasikan memori secara dinamis dan datanya akan disimpan pada memori heap. Fungsi ini akan menghasilkan sebuah pointer yang berisi alamat memori pada heap.
Berikut ini Syntax atau format dasar penggunaan malloc():
type *nama_var = malloc(ukuran);
atau bisa juga ditulis seperti ini :
Nama var = (Type*) malloc(ukuran)
Keterangan :
Pada format penggunaan fungsi malloc() maksudnya adalah :
- type adalah tipe data variabel yang ingin kita buat;
- *nama_var adalah variabel yang bentuknya pointer;
- ukuran adalah ukuran alokasi memori dalam satuan byte dengan tipe integer.
Contoh:
int *ab = malloc(100);
Pada contoh ini, kita membuat variabel *ab dengan tipe data int dan akan disimpan ke dalam heap dengan ukuran 100 byte. Jika ingin ukurannya mengikuti ukuran tipe data, kita bisa gunakan fungsi sizeof() seperti ini:
ab = (int*) malloc(100 * sizeof(int));
Artinya variabel ab akan mengalokasikan 400 byte memori karena ukuran int adalah 4 byte. Jadi, 4*100 = 400 byte, lalu pointer akan menyimpan alamat byte pertama dalam memori yang dialokasikan. Sedangkan untuk fungsi sizeof() biasanya kita pakai untuk menentukan ukuran secara dinamis.
Contoh program :
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* ab;
int n, i;
// Mendapatkan jumlah elemen untuk array
printf("Inputkan jumlah elemen:");
scanf("%d",&n);
printf("jumlah elemen yang diinput adalah: %d\n", n);
// Alokasikan memori secara dinamis menggunakan malloc()
ab = (int*)malloc(n * sizeof(int));
/*Periksa apakah memori telah berhasil
dialokasikan oleh malloc atau tidak*/
if (ab == NULL) {
printf("Memori gagal dialokasikan.\n");
exit(0);
}
else {
// Memori telah berhasil dialokasikan
printf("Memori berhasil dialokasikan menggunakan malloc.\n");
// Mendapatkan elemen array
for (i = 0; i < n; ++i) {
ab[i] = i + 1;
}
// Cetak elemen array
printf("Elemen-elemen dari array adalah: ");
for (i = 0; i < n; ++i) {
printf("%d, ", ab[i]);
}
}
return 0;
}
Hasilnya :
Mengenal Fungsi calloc()
Metode calloc atau “alokasi bersebelahan” digunakan untuk mengalokasikan memori dengan mengubah nilai semua memori yang dialokasikan ke nol.
Berikut ini Syntax atau format dasar penggunaan calloc():
nama_variabel = (type*)calloc(n, ukuran elemen);
di sini, n adalah no. elemen dan ukuran elemen adalah ukuran dari setiap elemen.
Contoh :
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, n;
int *a;
printf("Banyak bilangan yang akan di-input:");
scanf("%d",&n);
a = (int*)calloc(n, sizeof(int));
printf("input %d bilangan:\n",n);
for( i=0 ; i < n ; i++ )
{
scanf("%d",&a[i]);
}
printf("Bilangan yang diinput adalah: ");
for( i=0 ; i < n ; i++ )
{
printf("%d ",a[i]);
}
printf("\n");
free( a );
return(0);
}
Hasilnya :
Mengenal Fungsi realloc()
metode “realloc” atau “re-allocation” pada Bahasa C digunakan untuk mengubah alokasi memori secara dinamis dari memori yang dialokasikan sebelumnya.
Dengan kata lain, jika memori yang sebelumnya dialokasikan dengan bantuan malloc atau calloc tidak mencukupi, realloc dapat digunakan untuk mengalokasikan kembali memori secara dinamis.
Alokasi ulang memori mempertahankan nilai yang sudah ada dan blok baru akan diinisialisasi dengan nilai default. Apabila ruang tidak mencukupi, alokasi gagal dan mengembalikan pointer NULL.
Berikut ini Sintaks atau format dasar penggunaan malloc():
nama_variabel = realloc(ptr, ukuranBaru);
di mana ptr dialokasikan kembali dengan ukuran baru ‘ ukuranBaru’.
Contoh program :
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* ptr;
int n, i;
// Dapatkan jumlah elemen untuk array
n = 12;
printf("jumlah elemen yang diinput : %d\n", n);
// Alokasikan memori secara dinamis menggunakan calloc()
ptr = (int*)calloc(n, sizeof(int));
/* Periksa apakah memori telah berhasil
dialokasikan oleh malloc atau tidak */
if (ptr == NULL) {
printf("Memori gagal dialokasi.\n");
exit(0);
}
else {
// Cetak Memori yang telah berhasil dialokasikan
printf("Memori telah berhasil dialokasikan.\n");
// Mendapatkan elemen-elemen dari array
for (i = 0; i < n; ++i) {
ptr[i] = i + 1;
}
// Cetak elemen array
printf("Elemen-elemen dari array adalah: ");
for (i = 0; i < n; ++i) {
printf("%d, ", ptr[i]);
}
// Mendapatkan ukuran baru untuk array
n = 15;
printf("\n\nMasukkan ukuran baru dari array: %d\n", n);
// Alokasi ulang memori secara dinamis menggunakan realloc()
ptr = realloc(ptr, n * sizeof(int));
// Cetak Memori telah berhasil dialokasikan ulang
printf("Memori berhasil dialokasikan ulang.\n");
// Dapatkan elemen baru dari array
for (i = 5; i < n; ++i) {
ptr[i] = i + 1;
}
// Cetak elemen array
printf("Elemen-elemen dari array adalah: ");
for (i = 0; i < n; ++i) {
printf("%d, ", ptr[i]);
}
free(ptr);
}
return 0;
}
Hasilnya :
Mengenal Fungsi free()
Fungsi free() adalah digunakan untuk meng-dealokasikan atau menghapus alokasi memori yang sudah dibuat oleh fungsi malloc(), calloc(), dan realloc(). Hal ini dapat membantu mengurangi pemborosan memori.
sintaks :
free(nama_variabel);
Contoh Program :
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *ptr, *ptr1;
int n, i;
// Dapatkan jumlah elemen untuk array
n = 12;
printf("Masukkan jumlah elemen: %d\n", n);
// Alokasikan memori secara dinamis menggunakan malloc()
ptr = (int*)malloc(n * sizeof(int));
// Alokasikan memori secara dinamis menggunakan calloc()
ptr1 = (int*)calloc(n, sizeof(int));
/* Periksa apakah memori telah berhasil
dialokasikan oleh malloc atau tidak */
if (ptr == NULL || ptr1 == NULL) {
printf("Memori gagal dialokasi.\n");
exit(0);
}
else {
// Memori telah berhasil dialokasikan
printf("Memori berhasil dialokasikan menggunakan malloc.\n");
// Kosongkan memori malloc menggunakan fungsi free()
free(ptr);
printf("Memori Malloc berhasil dikosongkan.\n");
// Memori telah berhasil dialokasikan
printf("\nMemori berhasil dialokasikan menggunakan calloc.\n");
// Kosongkan memori calloc menggunakan fungsi free()
free(ptr1);
printf("Calloc Memory berhasil dikosongkan.\n");
}
return 0;
}
Hasilnya :
Beitulah pembahasan tentang bahasa C mengenai Alokasi Memori. semoga bermanfaat ..