Alokasi Memori Dinamis di C: malloc(), calloc()
โก Ringkasan Cerdas
Alokasi memori dinamis dalam C memesan dan melepaskan memori heap pada saat runtime menggunakan fungsi malloc(), calloc(), realloc(), dan free() dari pustaka stdlib.h, memungkinkan program untuk mengatur ukuran array dan struktur secara fleksibel ketika kebutuhan tidak diketahui sebelum eksekusi.

Bagaimana Manajemen Memori di C bekerja?
Saat Anda mendeklarasikan variabel menggunakan tipe data dasar, kompiler C secara otomatis mengalokasikan ruang memori untuk variabel tersebut dalam kumpulan memori yang disebut tumpukan (stack).
Sebagai contoh, variabel float biasanya membutuhkan 4 byte (tergantung platform) saat dideklarasikan. Kita dapat memverifikasi informasi ini menggunakan operator sizeof seperti yang ditunjukkan pada contoh di bawah ini.
#include <stdio.h> int main() { float x; printf("The size of float is %d bytes", sizeof(x)); return 0;}
output akan:
The size of float is 4 bytes
Selain itu, array dengan ukuran tertentu dialokasikan dalam blok memori yang berdekatan, setiap blok memiliki ukuran untuk satu elemen:
#include <stdio.h> int main() { float arr[10]; printf("The size of the float array with 10 element is %d", sizeof(arr)); return 0;}
Hasilnya adalah:
The size of the float array with 10 element is 40
Seperti yang telah dipelajari sejauh ini, saat mendeklarasikan tipe data dasar atau array, memori dikelola secara otomatis. Namun, ada proses alokasi memori di C yang memungkinkan Anda untuk mengimplementasikan program di mana ukuran array tidak ditentukan hingga Anda menjalankan program Anda (runtime). Proses ini disebut "Alokasi memori dinamis."
Alokasi Memori Dinamis di C
Alokasi Memori Dinamis adalah alokasi dan pembebasan memori secara manual sesuai dengan kebutuhan pemrograman Anda. Memori dinamis dikelola dan dilayani dengan pointer yang menunjuk ke ruang memori yang baru dialokasikan di area yang kita sebut heap.
Sekarang Anda dapat membuat dan menghancurkan serangkaian elemen secara dinamis saat runtime tanpa masalah. Singkatnya, manajemen memori otomatis menggunakan tumpukan, dan Alokasi Memori Dinamis C menggunakan tumpukan.
Itu perpustakaan memiliki fungsi yang bertanggung jawab untuk Manajemen Memori Dinamis.
| fungsi | Tujuan |
|---|---|
| malloc () | Mengalokasikan memori dengan ukuran yang diminta dan mengembalikan penunjuk ke byte pertama ruang yang dialokasikan. |
| panggilan() | Mengalokasikan ruang untuk elemen array. Menginisialisasi elemen ke nol dan mengembalikan pointer ke memori. |
| alokasi ulang() | Ini digunakan untuk mengubah ukuran ruang memori yang dialokasikan sebelumnya. |
| Bebas() | Membebaskan atau mengosongkan ruang memori yang dialokasikan sebelumnya. |
Mari kita bahas fungsi-fungsi di atas beserta penerapannya
malloc() fungsi di C
Fungsi C malloc() adalah singkatan dari alokasi memori. Ini adalah fungsi yang digunakan untuk mengalokasikan blok memori secara dinamis. Ini mencadangkan ruang memori dengan ukuran tertentu dan mengembalikan penunjuk nol yang menunjuk ke lokasi memori. Pointer yang dikembalikan biasanya bertipe void. Artinya kita dapat menetapkan fungsi C malloc() ke pointer mana pun.
Sintaks malloc() Fungsi:
ptr = (cast_type *) malloc (byte_size);
Di sini,
- ptr adalah penunjuk cast_type.
- Fungsi C malloc() mengembalikan pointer ke memori yang dialokasikan byte_size.
Contoh malloc():
Example: ptr = (int *) malloc (50)
Ketika pernyataan ini berhasil dijalankan, ruang memori sebesar 50 byte dicadangkan. Alamat byte pertama dari ruang cadangan diberikan ke penunjuk ptr bertipe int.
Perhatikan contoh lain:
#include <stdlib.h> int main(){ int *ptr; ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */ if (ptr != NULL) { *(ptr + 5) = 480; /* assign 480 to sixth integer */ printf("Value of the 6th integer is %d",*(ptr + 5)); } }
Keluaran:
Value of the 6th integer is 480
- Perhatikan bahwa sizeof(*ptr) digunakan sebagai pengganti sizeof(int) agar kode lebih tangguh ketika deklarasi *ptr diubah tipenya ke tipe data yang berbeda di kemudian hari.
- Alokasi mungkin gagal jika memori tidak mencukupi. Dalam hal ini, ia mengembalikan pointer NULL. Jadi, Anda harus memasukkan kode untuk memeriksa pointer NULL.
- Perlu diingat bahwa memori yang dialokasikan adalah bersebelahan dan dapat diperlakukan sebagai array. Kita dapat menggunakan aritmatika pointer untuk mengakses elemen array daripada menggunakan tanda kurung [ ]. Kami menyarankan untuk menggunakan + untuk merujuk ke elemen array karena penggunaan incrementation ++ atau += mengubah alamat yang disimpan oleh petunjuk.
Fungsi Malloc() juga dapat digunakan dengan tipe data karakter maupun tipe data kompleks seperti struktur.
fungsi gratis() di C
Memori untuk variabel secara otomatis dibatalkan alokasinya pada waktu kompilasi. Dalam alokasi memori dinamis, Anda harus membatalkan alokasi memori secara eksplisit. Jika tidak dilakukan, Anda mungkin mengalami kesalahan kehabisan memori.
Fungsi free() dipanggil untuk melepaskan/membebaskan memori dalam bahasa C. Dengan membebaskan memori dalam program Anda, Anda membuat lebih banyak memori tersedia untuk digunakan nanti.
Sebagai contoh:
#include <stdio.h> int main() { int* ptr = malloc(10 * sizeof(*ptr)); if (ptr != NULL){ *(ptr + 2) = 50; printf("Value of the 2nd integer is %d",*(ptr + 2)); } free(ptr); }
Keluaran:
Value of the 2nd integer is 50
fungsi calloc() di C
Fungsi calloc() dalam C merupakan singkatan dari contiguous allocation. Fungsi ini digunakan untuk mengalokasikan beberapa blok memori. Fungsi ini merupakan fungsi alokasi memori dinamis yang digunakan untuk mengalokasikan memori ke struktur data kompleks seperti array dan struktur.
Fungsi Malloc() digunakan untuk mengalokasikan satu blok ruang memori sedangkan calloc() di C digunakan untuk mengalokasikan beberapa blok ruang memori. Setiap blok yang dialokasikan oleh fungsi calloc() memiliki ukuran yang sama.
Sintaks calloc() Fungsi:
ptr = (cast_type *) calloc (n, size);
Pernyataan di atas digunakan untuk mengalokasikan n blok memori dengan ukuran yang sama.
Setelah ruang memori dialokasikan, maka semua byte diinisialisasi ke nol.
Pointer yang saat ini berada pada byte pertama dari ruang memori yang dialokasikan dikembalikan.
Setiap kali ada kesalahan dalam mengalokasikan ruang memori seperti kekurangan memori, maka penunjuk nol dikembalikan.
Contoh calloc():
Program di bawah ini menghitung jumlah barisan aritmatika.
#include <stdio.h> int main() { int i, * ptr, sum = 0; ptr = calloc(10, sizeof(int)); if (ptr == NULL) { printf("Error! memory not allocated."); exit(0); } printf("Building and calculating the sequence sum of the first 10 terms \ n "); for (i = 0; i < 10; ++i) { * (ptr + i) = i; sum += * (ptr + i); } printf("Sum = %d", sum); free(ptr); return 0; }
Hasil:
Building and calculating the sequence sum of the first 10 terms
Sum = 45
calloc() vs. malloc(): Perbedaan Utama
Berikut ini adalah perbedaan utama antara malloc() Vs calloc() dalam C:
Fungsi calloc() secara umum lebih sesuai dan efisien daripada fungsi malloc(). Meskipun kedua fungsi tersebut digunakan untuk mengalokasikan ruang memori, calloc() dapat mengalokasikan beberapa blok sekaligus. Anda tidak perlu meminta blok memori setiap saat. Fungsi calloc() digunakan dalam struktur data kompleks yang memerlukan ruang memori lebih besar.
Blok memori yang dialokasikan oleh calloc() di C selalu diinisialisasi ke nol sedangkan di fungsi malloc() di C, selalu berisi nilai sampah.
fungsi realloc() di C
Dengan menggunakan fungsi C realloc(), Anda dapat menambahkan ukuran memori ke memori yang sudah dialokasikan. Fungsi ini memperluas blok memori saat ini sambil mempertahankan isi aslinya. realloc() dalam bahasa C merupakan singkatan dari realokasi memori.
realloc() juga dapat digunakan untuk mengurangi ukuran memori yang dialokasikan sebelumnya.
Sintaks fungsi realloc():
ptr = realloc (ptr,newsize);
Pernyataan di atas mengalokasikan ruang memori baru dengan ukuran tertentu dalam variabel newsize. Setelah menjalankan fungsi tersebut, penunjuk akan dikembalikan ke byte pertama blok memori. Ukuran barunya bisa lebih besar atau lebih kecil dari memori sebelumnya. Kami tidak dapat memastikan apakah blok yang baru dialokasikan akan menunjuk ke lokasi yang sama dengan blok memori sebelumnya. Fungsi ini akan menyalin semua data sebelumnya di wilayah baru. Ini memastikan bahwa data akan tetap aman.
Contoh alokasi ulang():
#include <stdio.h> int main () { char *ptr; ptr = (char *) malloc(10); strcpy(ptr, "Programming"); printf(" %s, Address = %u\n", ptr, ptr); ptr = (char *) realloc(ptr, 20); //ptr is reallocated with new size strcat(ptr, " In 'C'"); printf(" %s, Address = %u\n", ptr, ptr); free(ptr); return 0; }
Setiap kali realloc() dalam C menghasilkan operasi yang gagal, ia mengembalikan penunjuk null, dan data sebelumnya juga dibebaskan.
Array Dinamis di C
Array Dinamis dalam C memungkinkan jumlah elemen bertambah sesuai kebutuhan. Array Dinamis C banyak digunakan dalam algoritma ilmu komputer.
Dalam program berikut, kami telah membuat dan mengubah ukuran array Dinamis di C
#include <stdio.h> int main() { int * arr_dynamic = NULL; int elements = 2, i; arr_dynamic = calloc(elements, sizeof(int)); //Array with 2 integer blocks for (i = 0; i < elements; i++) arr_dynamic[i] = i; for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]); elements = 4; arr_dynamic = realloc(arr_dynamic, elements * sizeof(int)); //reallocate 4 elements printf("After realloc\n"); for (i = 2; i < elements; i++) arr_dynamic[i] = i; for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]); free(arr_dynamic); }
Hasil program C Dynamic array di layar:
arr_dynamic[0]=0 arr_dynamic[1]=1 After realloc arr_dynamic[0]=0 arr_dynamic[1]=1 arr_dynamic[2]=2 arr_dynamic[3]=3

