calloc() Fungsi di Perpustakaan C dengan CONTOH Program
โก Ringkasan Cerdas
Fungsi calloc() dalam bahasa C memesan beberapa blok memori yang berdekatan di heap dan menginisialisasi setiap byte menjadi nol, mengembalikan pointer void yang memungkinkan program membuat array dan struktur data yang bersih dan siap digunakan saat runtime.

Apa itu calloc di C?
Fungsi `calloc()` dalam bahasa C digunakan untuk mengalokasikan beberapa blok memori dengan ukuran yang sama. Ini adalah fungsi alokasi memori dinamis yang mengalokasikan ruang memori untuk struktur data kompleks seperti array dan struktur, dan mengembalikan pointer `void` ke memori tersebut. `Calloc` merupakan singkatan dari alokasi berurutan (contiguous allocation).
Fungsi maloc digunakan untuk mengalokasikan satu blok ruang memori sedangkan fungsi calloc di C digunakan untuk mengalokasikan beberapa blok ruang memori. Setiap blok yang dialokasikan oleh calloc dalam pemrograman C berukuran sama.
Mengapa menggunakan calloc() di C?
Variabel biasa dan array berukuran tetap mengunci dimensinya saat program dikompilasi, yang membuang ruang saat elemen yang dibutuhkan lebih sedikit dan gagal total saat dibutuhkan lebih banyak elemen. calloc() menghilangkan batasan itu dengan memesan memori saat runtime dan, tidak seperti malloc(), ia membersihkan setiap byte menjadi nol sebelum mengembalikan blok tersebut. Hal ini menjadikan calloc() pilihan yang tepat setiap kali program membutuhkan area memori yang bersih dan dapat diprediksi untuk array atau struktur yang ukurannya hanya diketahui saat kode berjalan.
Alokasi dinamis dengan calloc() cocok untuk beberapa situasi umum:
- Array numerik yang harus dimulai dari nol, seperti penghitung, histogram, atau akumulator berjalan.
- Struktur data di mana nilai sampah yang tersisa akan menyebabkan masalah yang halus dan sulit diatasi.tracdan serangga.
- Bufferyang panjangnya bergantung pada masukan pengguna atau file yang dibaca saat program berjalan.
- Blok terlalu besar untuk tumpukan yang terbatas, karena calloc() mengambil memori dari heap yang jauh lebih besar.
Karena blok yang dicadangkan berdekatan dan sudah diisi dengan nol, blok tersebut dapat langsung diperlakukan sebagai array yang siap digunakan tanpa loop inisialisasi terpisah.
calloc() Sintaks:
ptr = (cast_type *) calloc (n, size);
- Contoh pernyataan calloc di C di atas digunakan untuk mengalokasikan n blok memori dengan ukuran yang sama.
- Setelah ruang memori dialokasikan, maka semua byte diinisialisasi ke nol.
- The petunjuk 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 pointer nol dikembalikan seperti yang ditunjukkan pada contoh calloc di bawah ini.
Cara menggunakan calloc
Program calloc di bawah ini di C 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 calloc pada contoh C:
Building and calculating the sequence sum of the first 10 terms
Sum = 45
Perbedaan antara calloc() dan malloc()
Baik calloc() maupun malloc() sama-sama memesan memori di heap dan sama-sama mengembalikan pointer void, atau NULL jika gagal, namun keduanya berbeda dalam tiga hal praktis yang menentukan mana yang harus digunakan.
- Inisialisasi: calloc() mengatur setiap byte dalam blok baru menjadi nol, sedangkan malloc() membiarkan isinya tidak diinisialisasi, sehingga blok malloc() menyimpan data sampah yang tidak dapat diprediksi sampai program menulis ke dalamnya.
- Argumen: calloc() menerima dua argumen, jumlah elemen dan ukuran masing-masing, ditulis calloc(n, size); malloc() menerima satu argumen, jumlah total byte, ditulis malloc(n * size).
- Kecepatan: malloc() sedikit lebih cepat karena melewati langkah pengisian nol, itulah sebabnya kode yang langsung menimpa memori sering kali lebih menyukainya.
Kedua fungsi tersebut dideklarasikan dalam stdlib.h dan keduanya melepaskan memori dengan fungsi free() yang sama. Pilih calloc() ketika blok yang bersih dan berisi nol penting, dan malloc() ketika kecepatan mentah lebih disukai dan program menangani inisialisasi sendiri.
Cara Membebaskan Memori yang Dialokasikan oleh calloc()
Memori yang dicadangkan oleh calloc() berada di heap dan tidak pernah dilepaskan secara otomatis. Ketika sebuah program terus mengalokasikan tanpa membebaskan, program tersebut perlahan-lahan mengonsumsi semua memori yang tersedia, suatu cacat yang dikenal sebagai kebocoran memori. Fungsi free() mengembalikan blok yang telah selesai ke sistem sehingga ruang tersebut dapat digunakan kembali oleh alokasi selanjutnya.
Fungsi free() menerima satu argumen, yaitu pointer yang dikembalikan oleh calloc(), dan melepaskan seluruh blok sekaligus:
int *ptr; ptr = calloc(10, sizeof(int)); if (ptr != NULL) { /* use the allocated memory here */ free(ptr); /* release the block */ ptr = NULL; /* avoid a dangling pointer */ }
Ikuti aturan-aturan ini untuk mengelola memori calloc() dengan aman:
- Panggil fungsi free() tepat satu kali untuk setiap calloc() yang berhasil; membebaskan blok yang sama dua kali akan menyebabkan perilaku yang tidak terdefinisi.
- Setelah membebaskan memori, atur pointer ke NULL agar tidak dapat digunakan kembali sebagai pointer yang mengambang (dangling pointer).
- Jangan pernah membebaskan (free) pointer yang tidak dikembalikan oleh calloc(), termasuk pointer yang digeser oleh aritmatika pointer.
- Cocokkan setiap alokasi dengan pelepasan sebelum penunjuk keluar dari cakupan.
Karena calloc() dan malloc() sama-sama mengambil dari heap yang sama, disiplin pembebasan (freeing discipline) identik untuk kedua fungsi tersebut: satu free() untuk setiap alokasi yang berhasil, dan tidak ada akses ke blok tersebut setelahnya. Keeping Alokasi dan pelepasan memori secara seimbang adalah kebiasaan inti dari manajemen memori manual dalam bahasa C, dan hal ini mencegah kebocoran memori dan kerusakan yang disebabkan oleh penggunaan kembali memori yang telah dikembalikan.
