Memori adalah salah satu hal yang penting dalam pemrograman, yaitu untuk menyimpan program, variabel dan melakukan operasi. Oleh karena itu, tanpa adanya memori program tidak bisa berjalan sebagai mana mestinya. Dengan demikian kita harus mengatur memori sebaik mungkin dengan mempelajari memori manajemen yang kali ini dengan bahasa C. Bukan hanya file yang kita miliki, melainkan penggunaan memori saat program berjalan.
C menyediakan berbagai fungsi untuk mengatur penggunaan memori (memory management) sehingga bahasa C mendukung Dynamic memory allocation. Dynamic memory allocation adalah proses untuk mengalokasikan maupun membebaskan memori sesuai dengan kebutuhan. Oleh karenanya kita dapat meminimalkan memori yang tidak akan kita gunakan. Untuk menggunakan fungsi-fungsi tersebut, kita butuh salah satu header, yaitu stdlib.h
.
Daftar isi
malloc()
Fungsi ini berguna untuk mengalokasikan memori sebanyak yang diinginkan dalam besaran byte. Ketika menggunakan malloc()
, fungsi akan mengembalikan alamat dari memori yang teralokasi. Oleh karena itu, akan lebih maksimal apabila menyimpannya dengan pointer. Secara umum, sintaks dari malloc()
adalah
malloc(size);
Dengan sintaks tersebut, komputer akan mengalokasikan memori sebanyak size secara berurutan. Jadi program tidak akan menggunakan rentang memori tersebut untuk yang lainnya.
Contoh:
#include <stdio.h> #include <stdlib.h> int main(){ int *ptr = malloc(12); printf("%d\n", ptr); }
Misalkan keluaran dari potongan kode tersebut adalah 1000, maka alamat 1000-1011 milik variabel ptr
. Karena memori tersebut berurutan, kita juga dapat menggunakannya untuk membuat sebuah array. Contoh penggunaan malloc()
:
#include <stdio.h> #include <stdlib.h> int main(){ int *arr = malloc(10 * sizeof(int)); *arr = 100; *(arr+3) = 10; printf("%d %d\n",*arr, *(arr+3)); }
Pada contoh tersebut pengalokasian menggunakan parameter 10 * sizeof(int)
, artinya komputer harus mengalokasikan sebanyak 10*ukuran integer. Dengan kata lain, arr
sama seperti array dengan kapasitas 10. Jadi keluaran program adalah 100 10
yang juga merupakan index ke-0 dan ke-3.
Fungsi ini akan mengembalikan sebuah alamat, sehingga ketika pengalokasian memori tidak berhasil maka fungsi akan mengembalikan nilai NULL. Dengan demikian perlu untuk memeriksa bahwa alokasi berhasil.
int *ptr = malloc(10*sizeof(*ptr)); if (ptr != NULL)
calloc()
Fungsi calloc()
juga berfungsi untuk mengalokasikan memori, namun lebih sering untuk array dan struct. Sintaks fungsi ini sedikit berbeda dari malloc()
. Perbedaanya terletak pada jumlah argumen, calloc()
membutuhkan 2 parameter, yaitu jumlah elemen dan masing-masing ukuran (sama seperti contoh malloc()
terakhir). Contoh:
#include <stdio.h> #include <stdlib.h> int main(){ int *arr = calloc(10, sizeof(int)); for(int i=0;i<10;i++) *(arr+i) = i; for(int i=0;i<10;i++) printf("%d ", *(arr+i)); }
Contoh lain dengan menggunakan struct:
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct{ int absen; char nama[50]; char alamat[50]; }siswa_t; int main(){ siswa_t *rec = calloc(40, sizeof(siswa_t)); for(int i=0; i<40; i++){ char input[50]; (rec+i)->absen = i+1; printf("Absen %d\t:\n", i+1); printf("Nama\t: "); gets(input); strcpy((rec+i)->nama, input); printf("Alamat\t: "); gets(input); strcpy((rec+i)->alamat, input); } for(int i=0; i<40; i++){ printf("Absen %d:\n", i+1); printf("Nama\t: %s\n", (rec+i)->nama); printf("Alamat\t: %s\n", (rec+i)->alamat); printf("==============================\n"); } }
Pada baris 12 ada variabel rec
yang berfungsi sebagai array siswa dan dapat menampung 40 data. Untuk mengakses index dapat dengan aritmetika pointer seperti penggunaan perulangan pada contoh.
Free()
Seperti namanya, fungsi ini adalah untuk membebaskan memori ketika memori tersebut sudah tidak dibutuhkan, meskipun memori tetap dibebaskan setelah program selesai dijalankan. Bebas artinya komputer dapat menggunakan kembali memori tersebut. Sintaks dari fungsi ini juga sederhana, yaitu
free(num);
Dengan num berisi alamat memori.
#include <stdio.h> #include <stdlib.h> int main() { int *ptr; ptr = malloc(10*sizeof(*ptr)); free(ptr); }
realloc()
Fungsi ini merupakan fungsi untuk mengubah ukuran dari memori yang sudah teralokasi. Dengan dua parameter yaitu nama variabel dan ukuran memori baru.
#include <stdio.h> #include <stdlib.h> int main() { int *arr = malloc(10 * sizeof(int)); if (arr != NULL) { *arr = 100; *(arr + 3) = 10; printf("%d %d\n", *arr, *(arr + 3)); } arr = realloc(arr, 100 * sizeof(int)); *(arr + 45) = 56; printf("%d %d\n", *arr, *(arr + 45)); }
arr awalnya memiliki kapasitas 10 yang kemudian menjadi 100 buah integer.
Mempelajari memori manajemen terutama dengan bahasa C sangat penting karena hal ini juga merupakan keunggulan dari bahasa C yang tidak semua bahasa pemrograman miliki. Dengan menggunakannya, tentu saja penggunaan memori jadi lebih efisien ketika program dijalankan.