malloc() Fungsi di perpustakaan C dengan CONTOH

โšก Ringkasan Cerdas

Fungsi malloc() dalam bahasa C memesan blok memori di heap pada saat runtime dan mengembalikan pointer void ke byte pertamanya, memungkinkan program untuk meminta penyimpanan yang ukurannya tidak diketahui sampai kode tersebut benar-benar dieksekusi.

  • ๐Ÿง  Alokasi waktu eksekusi: malloc() memesan memori selama eksekusi ketika ukuran yang dibutuhkan tidak diketahui pada saat kompilasi.
  • ๐Ÿ“ฆ sintaks: Pointer cast_type menerima malloc(byte_size), yang biasanya diatur ukurannya dengan sizeof untuk portabilitas.
  • โš ๏ธ Pemeriksaan NULL: Permintaan yang gagal akan mengembalikan pointer NULL, jadi validasi hasilnya sebelum melakukan dereferensi.
  • โž• Aritmatika penunjuk: Blok tersebut berdekatan, jadi gunakan + daripada ++ untuk mencapai elemen array.
  • รฐลธยงยน Bebaskan ingatan itu: Bebaskan setiap blok dengan free() untuk mencegah kebocoran memori dan pointer yang mengarah ke memori yang tidak valid.
  • ๐Ÿค– Bantuan AI: Asisten AI dan GitHub Copilot menyusun draf panggilan malloc() dan menandai pernyataan free() yang hilang.

Fungsi malloc() dalam bahasa C

Apa itu malloc di C?

Fungsi 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 malloc ke pointer mana pun.

Apa itu malloc di C

Sintaksis

ptr = (cast_type *) malloc (byte_size);

Di sini,

  • ptr adalah penunjuk cast_type.
  • Fungsi malloc mengembalikan pointer ke memori yang dialokasikan byte_size.
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 penerapan malloc:

#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 bersifat berurutan dan dapat diperlakukan sebagai array. Kita dapat menggunakan petunjuk Gunakan aritmatika untuk mengakses elemen array daripada menggunakan tanda kurung siku [ ]. Kami menyarankan untuk menggunakan + untuk merujuk ke elemen array karena penggunaan penambahan ++ atau += mengubah alamat yang disimpan oleh pointer.

Fungsi Malloc juga dapat digunakan dengan tipe data karakter maupun tipe data kompleks seperti struktur.

Mengapa menggunakan malloc() di C?

Array statis dan variabel biasa menetapkan ukurannya saat program dikompilasi, yang membuang ruang ketika kebutuhan ternyata lebih kecil dan gagal total ketika kebutuhan ternyata lebih besar. Fungsi `malloc()` mengatasi masalah ini dengan meminta memori saat runtime, sehingga program dapat mengatur ukuran buffer sesuai dengan jumlah data yang diterimanya. Fleksibilitas runtime inilah yang menjadi inti dari alokasi memori dinamis di C

Alokasi dinamis dengan malloc() adalah pilihan yang tepat dalam beberapa situasi umum:

  • Jumlah input tidak diketahui sampai program dijalankan, misalnya saat membaca file atau daftar yang diberikan pengguna.
  • Diperlukan blok-blok besar yang akan menyebabkan stack yang terbatas meluap, karena malloc() mengambil memori dari heap yang jauh lebih besar.
  • Data harus tetap ada meskipun fungsi yang membuatnya telah berakhir, karena memori heap akan tetap ada sampai dilepaskan secara eksplisit.
  • Struktur dan array perlu bertambah besar atau berkurang ukurannya selama program berjalan.

Karena blok yang dicadangkan dikembalikan sebagai pointer, blok tersebut dapat diteruskan antar fungsi dengan mudah tanpa perlu menyalin data yang mendasarinya.

Cara Membebaskan Memori yang Dialokasikan oleh malloc()

Memori yang dialokasikan oleh malloc() 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.

Fungsi free() menerima satu argumen, yaitu pointer yang dikembalikan oleh malloc(), dan melepaskan seluruh blok memori sekaligus:

int *ptr;
ptr = malloc(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 dinamis dengan aman:

  • Panggil fungsi free() tepat satu kali untuk setiap malloc() 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 malloc(), termasuk pointer yang digeser oleh aritmatika pointer.
  • Cocokkan setiap alokasi dengan pelepasan yang sesuai sebelum penunjuk keluar dari cakupan.

Keeping Alokasi dan pelepasan memori secara seimbang adalah disiplin inti dari manajemen memori manual dalam bahasa C, dan hal ini mencegah kebocoran memori dan kerusakan yang disebabkan oleh penggunaan kembali memori yang telah dibebaskan.

malloc() vs calloc(): Perbedaan Utama

malloc() dan panggilan() Keduanya memesan memori heap, tetapi berbeda dalam argumen dan cara mereka memperlakukan blok baru. malloc() mengambil satu argumen, jumlah total byte, dan membiarkan isinya tidak diinisialisasi, sehingga blok tersebut menyimpan nilai sampah yang tidak dapat diprediksi sampai program menulis ke dalamnya. calloc() mengambil dua argumen, jumlah elemen dan ukuran masing-masing, dan membersihkan setiap byte menjadi nol sebelum mengembalikan pointer.

Perbedaan praktisnya dapat diringkas menjadi tiga poin:

  • Inisialisasi: calloc() mengosongkan memori, sedangkan malloc() tidak, yang membuat malloc() sedikit lebih cepat ketika nilai-nilai tersebut akan ditimpa anyway.
  • Argumen: Anda menulis malloc(n * size) tetapi calloc(n, size) untuk memesan array yang sama.
  • Kasus penggunaan: pilih calloc() ketika blok yang bersih dan berisi nol penting, dan malloc() ketika kecepatan lebih diutamakan dan inisialisasi ditangani secara manual.

Kedua fungsi tersebut dideklarasikan dalam stdlib.h, keduanya mengembalikan pointer void atau NULL jika gagal, dan keduanya mengembalikan memori dengan fungsi free() yang sama.

Pertanyaan Umum Demo Slot

Dalam bahasa C, konversi tipe data bersifat opsional dan seringkali tidak disarankan, karena `void*` secara otomatis dikonversi ke pointer objek apa pun dan konversi tipe data eksplisit dapat menutupi penyertaan `stdlib.h` yang hilang. C++Namun, para pemain tetap dibutuhkan.

Nilai kembalian NULL berarti permintaan gagal, biasanya karena memori tidak mencukupi. Selalu periksa pointer sebelum menggunakannya, karena mengakses NULL akan menyebabkan perilaku yang tidak terdefinisi dan biasanya membuat program berhenti bekerja.

realloc() mengubah ukuran blok yang sebelumnya dipesan oleh malloc(), keeping Data yang ada akan diisi hingga ukuran yang lebih kecil. Jika gagal, fungsi akan mengembalikan NULL dan membiarkan blok asli tetap utuh, jadi tetapkan hasilnya ke pointer sementara terlebih dahulu.

Kebocoran memori terjadi ketika memori heap dari malloc() tidak pernah dilepaskan dengan free(). Program terus memesan ruang yang tidak lagi digunakannya, yang secara bertahap dapat menghabiskan memori yang tersedia.

malloc() memesan memori di heap, bukan di stack. Blok heap tetap valid hingga Anda memanggil free(), sehingga blok tersebut dapat bertahan lebih lama daripada fungsi yang membuatnya, tidak seperti variabel stack otomatis yang hilang saat fungsi kembali.

malloc() adalah fungsi pustaka yang mengembalikan void* dan membutuhkan sizeof untuk menghitung byte. C++ `new` adalah operator yang mengembalikan pointer bertipe dan memanggil konstruktor. Pasangkan `malloc()` dengan `free()`, dan `new` dengan `delete`.

Ya. Asisten pengkodean AI membuat draf panggilan malloc(), menyisipkan pemeriksaan NULL, dan menandai panggilan free() yang hilang atau kebocoran memori, serta dapat menjelaskan aritmatika pointer. Selalu kompilasi dan uji kode yang dihasilkan sebelum mempercayainya.

Kopilot GitHub Menyarankan penggunaan malloc(), 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: