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.

  • ๐Ÿง  Memori yang diinisialisasi dengan nol: calloc() membersihkan setiap byte yang dialokasikan menjadi nol, tidak seperti malloc() yang meninggalkan nilai sampah yang tidak dapat diprediksi.
  • ๐Ÿ“ฆ Dua argumen: calloc(n, size) memesan n blok dengan ukuran tertentu dalam satu wilayah yang berdekatan.
  • โš ๏ธ Pemeriksaan NULL: Alokasi yang gagal akan mengembalikan pointer NULL, jadi validasi hasilnya sebelum menggunakannya.
  • ๐Ÿ†š calloc vs malloc: Pilih calloc() untuk array yang bersih dan berisi nilai nol, dan malloc() ketika kecepatan lebih penting daripada inisialisasi.
  • รฐลธยงยน Bebaskan ingatan itu: Lepaskan setiap blok calloc() dengan free() untuk mencegah kebocoran memori.
  • ๐Ÿค– Bantuan AI: Asisten AI dan GitHub Copilot menyusun draf panggilan calloc() dan menandai pernyataan free() yang hilang.

Fungsi calloc() dalam bahasa C

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.

Pertanyaan Umum Demo Slot

Fungsi calloc() dideklarasikan dalam header pustaka standar stdlib.h, jadi tambahkan #include di bagian atas file sumber. Tanpa itu, kompiler mungkin akan memberikan peringatan tentang deklarasi implisit dan salah membaca pointer yang dikembalikan.

Ketika heap tidak dapat memenuhi permintaan, calloc() mengembalikan pointer NULL alih-alih alamat yang valid. Selalu bandingkan hasilnya dengan NULL sebelum menggunakannya, karena mengakses NULL menyebabkan perilaku yang tidak terdefinisi dan biasanya menyebabkan program berhenti bekerja.

Ya. calloc() bekerja dengan semua tipe, termasuk struct dan array struct, dengan memberikan jumlah elemen dan sizeof(struct). Setiap anggota dinolkan, yang memberikan keadaan awal yang bersih tanpa loop inisialisasi manual.

Ya. realloc() menerima pointer apa pun yang dikembalikan oleh calloc() atau malloc() dan memperbesar atau memperkecil blok, sambil mempertahankan data yang ada. Byte baru yang ditambahkan oleh realloc() tidak dinolkan, jadi inisialisasi sendiri jika diperlukan.

Hasilnya bergantung pada implementasi: calloc() dapat mengembalikan NULL atau pointer unik yang tidak dapat di-dereferensi tetapi dapat dengan aman diteruskan ke free(). Perlakukan kedua hasil tersebut sebagai "tidak ada memori yang dapat digunakan" dan hindari membaca darinya.

calloc() memesan satu area kontinu yang cukup besar untuk semua elemen yang diminta, sehingga elemen-elemen tersebut tersusun berdekatan seperti sel array. Nama tersebut mencerminkan blok yang berdekatan dan telah dibersihkan ini, memungkinkan aritmatika pointer untuk menelusuri memori dengan andal.

Ya. Asisten pengkodean AI membuat draf panggilan calloc(), menambahkan pemeriksaan NULL, dan menandai panggilan free() yang hilang atau kebocoran memori, serta menjelaskan aritmatika pointer. Selalu kompilasi dan uji kode yang dihasilkan sebelum mempercayainya untuk digunakan di lingkungan produksi.

Kopilot GitHub menyarankan penggunaan calloc(), sizeof(), dan baris free() yang sesuai dari komentar yang menjelaskan maksud Anda. RevPeriksa setiap saran untuk memastikan tidak ada pengecekan NULL dan kebocoran memori sebelum Anda mengkompilasi.

Ringkaslah postingan ini dengan: