malloc vs calloc: Perbedaan Kunci Disertai Contoh Praktis
Apa Itu Alokasi Memori Dinamis?
Alokasi memori dinamis memungkinkan program meminta dan melepaskan memori saat runtime. Dalam C, pustaka standar menyediakan empat fungsi utama untuk tujuan ini – malloc(), calloc(), realloc(), dan free() – semuanya dideklarasikan dalam stdlib.h.
malloc(): Alokasi Satu Blok Memori
malloc() (singkatan dari "memory allocation") menyediakan blok byte yang bersebelahan dan mengembalikan pointer ke byte pertama. Isi blok yang baru dialokasikan tidak terdefinisi, berarti berisi bits apa pun yang berada di lokasi memori tersebut.
Penggunaan umum:
int *p = (int *)malloc(n * sizeof(int));
Jika permintaan gagal,
malloc() mengembalikan
NULL.
calloc(): Alokasi Beberapa Blok yang Diinisialisasi Nol
calloc() (singkatan dari "contiguous allocation") menerima dua argumen: jumlah elemen dan ukuran setiap elemen. Ini mengalokasikan memori untuk semua elemen dan secara otomatis mengatur setiap byte ke nol, membuatnya ideal untuk array atau struktur yang memerlukan keadaan awal yang bersih.
Penggunaan umum:
int *p = (int *)calloc(n, sizeof(int));
Seperti
malloc(), ini mengembalikan
NULL jika alokasi gagal.
Kapan Menggunakan Setiap Fungsi
- malloc() – Gunakan ketika Anda membutuhkan satu blok dan berencana untuk menginisialisasi memori sendiri. Ini sedikit lebih cepat karena melewati langkah pengosongan.
- calloc() – Gunakan ketika Anda membutuhkan array atau struktur yang harus dimulai dengan semua nol. Inisialisasi otomatis melindungi dari penggunaan nilai sampah secara tidak sengaja.
Ringkasan Sintaks
malloc()
void *malloc(size_t size);
calloc()
void *calloc(size_t num, size_t size);
Contoh Kode Praktis
Contoh 1: Menggunakan malloc() untuk Menyimpan 15 Integer
#include <stdlib.h> #include <stdio.h> int main(void) { int *ptr = malloc(15 * sizeof(*ptr)); if (!ptr) { perror("malloc failed"); return EXIT_FAILURE; } ptr[5] = 480; // elemen ke-6 (indeks berbasis 0) printf("Nilai integer ke-6 adalah %d\n", ptr[5]); free(ptr); return EXIT_SUCCESS; } Output: Nilai integer ke-6 adalah 480
Contoh 2: Menggunakan calloc() untuk Menghitung Jumlah
#include <stdlib.h> #include <stdio.h> int main(void) { int *ptr = calloc(10, sizeof(int)); if (!ptr) { perror("calloc failed"); return EXIT_FAILURE; } int sum = 0; for (int i = 0; i < 10; ++i) { ptr[i] = i; // inisialisasi redundan tetapi ditunjukkan untuk kejelasan sum += ptr[i]; } printf("Jumlah = %d\n", sum); free(ptr); return EXIT_SUCCESS; } Output: Jumlah = 45
Perbandingan Berdampingan
| Fitur | malloc() | calloc() |
| Jumlah parameter | 1 (ukuran) | 2 (jumlah, ukuran) |
| Kondisi memori setelah alokasi | Tidak diinisialisasi (sampah) | Diinisialisasi nol |
| Kasus penggunaan umum | Satu blok, inisialisasi manual | Array atau struktur yang membutuhkan awal bersih |
| Performa | Lebih cepat (tanpa pengosongan) | Lebih lambat (overhead pengosongan) |
| Keamanan | Risiko lebih tinggi menggunakan nilai sampah | Risiko lebih rendah karena pengosongan otomatis |
| Nilai kembali jika gagal | NULL | NULL |
| Header standar | stdlib.h | stdlib.h |
Kesimpulan
- Gunakan
malloc() ketika Anda membutuhkan satu blok dan akan menginisialisasinya sendiri untuk peningkatan performa kecil. - Gunakan
calloc() ketika Anda memerlukan memori yang diinisialisasi nol, terutama untuk array atau struct, untuk menghindari bug halus. - Kedua fungsi mengembalikan
NULL jika gagal; selalu periksa sebelum men-dereference. - Ingat untuk membebaskan memori yang dialokasikan dengan
free() untuk mencegah kebocoran memori.