Alokasi Memori Dinamis di C: Fungsi malloc (), calloc ()

Daftar Isi:

Anonim

Sebelum Anda mempelajari alokasi C Memori Dinamis, mari kita pahami:

Bagaimana Manajemen Memori di C bekerja?

Saat Anda mendeklarasikan variabel menggunakan tipe data dasar, compiler C secara otomatis mengalokasikan ruang memori untuk variabel dalam kumpulan memori yang disebut stack .

Misalnya, variabel float biasanya membutuhkan 4 byte (sesuai dengan platform) saat dideklarasikan. Kami dapat memverifikasi informasi ini menggunakan sizeof operator seperti yang ditunjukkan pada contoh di bawah ini

#include int main() { float x; printf("The size of float is %d bytes", sizeof(x)); return 0;}

Outputnya adalah:

 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 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

Sejauh yang telah dipelajari, saat mendeklarasikan tipe data dasar atau array, memori secara otomatis dikelola. Namun, ada proses untuk mengalokasikan memori dalam C yang akan memungkinkan Anda untuk mengimplementasikan program di mana ukuran larik belum diputuskan sampai Anda menjalankan program Anda (runtime). Proses ini disebut " Alokasi memori dinamis ".

Dalam tutorial ini, Anda akan belajar-

  • Bagaimana Manajemen Memori di C bekerja?
  • Alokasi Memori Dinamis di C
  • Fungsi C malloc ()
  • Fungsi free ()
  • C calloc () Fungsi
  • calloc () vs. malloc (): Perbedaan Utama
  • Fungsi C realloc ()
  • Array Dinamis

Alokasi Memori Dinamis di C

Alokasi Memori Dinamis adalah alokasi manual dan membebaskan memori sesuai dengan kebutuhan pemrograman Anda. Memori dinamis dikelola dan disajikan dengan pointer yang mengarah ke ruang memori yang baru dialokasikan di area yang kami sebut heap.

Sekarang Anda dapat membuat dan menghancurkan larik elemen secara dinamis saat runtime tanpa masalah. Singkatnya, manajemen memori otomatis menggunakan stack, dan C Dynamic Memory Allocation menggunakan heap.

Pustaka memiliki fungsi yang bertanggung jawab untuk Manajemen Memori Dinamis.

Fungsi Tujuan
malloc () Mengalokasikan memori dengan ukuran yang diminta dan mengembalikan penunjuk ke byte pertama dari ruang yang dialokasikan.
calloc () Mengalokasikan ruang untuk elemen array. Menginisialisasi elemen ke nol dan mengembalikan pointer ke memori.
realoc () Ini digunakan untuk mengubah ukuran ruang memori yang dialokasikan sebelumnya.
Gratis() Membebaskan atau mengosongkan ruang memori yang dialokasikan sebelumnya.

Mari kita bahas fungsi di atas dengan aplikasinya

Fungsi C malloc ()

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 pointer nol yang menunjuk ke lokasi memori. Pointer yang dikembalikan biasanya bertipe void. Ini berarti bahwa kita dapat menetapkan fungsi malloc () C ke pointer manapun.

Sintaks fungsi malloc ():

ptr = (cast_type *) malloc (byte_size);

Sini,

  • ptr adalah pointer dari cast_type.
  • Fungsi C malloc () mengembalikan pointer ke memori yang dialokasikan dari byte_size.

Contoh malloc ():

Example: ptr = (int *) malloc (50)

Ketika pernyataan ini berhasil dijalankan, ruang memori 50 byte dicadangkan. Alamat dari byte pertama dari ruang yang dicadangkan diberikan ke pointer ptr bertipe int.

Pertimbangkan contoh lain:

#include 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

  1. Perhatikan bahwa sizeof (* ptr) digunakan sebagai pengganti sizeof (int) untuk membuat kode lebih kuat ketika deklarasi * ptr diketikkan ke tipe data yang berbeda nanti.
  2. Alokasi mungkin gagal jika memori tidak cukup. Dalam kasus ini, ini mengembalikan pointer NULL. Jadi, Anda harus menyertakan kode untuk memeriksa pointer NULL.
  3. Perlu diingat bahwa memori yang dialokasikan bersebelahan dan dapat diperlakukan sebagai array. Kita bisa menggunakan aritmatika pointer untuk mengakses elemen array daripada menggunakan tanda kurung []. Kami menyarankan untuk menggunakan + untuk merujuk ke elemen array karena menggunakan incrementation ++ atau + = mengubah alamat yang disimpan oleh pointer.

Fungsi Malloc () juga dapat digunakan dengan tipe data karakter serta tipe data kompleks seperti struktur.

Fungsi free ()

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 / membatalkan alokasi memori di C. Dengan mengosongkan memori di program Anda, Anda membuatnya lebih tersedia untuk digunakan nanti.

Sebagai contoh:

#include 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

C calloc () Fungsi

Fungsi C calloc () adalah singkatan dari alokasi bersebelahan. Fungsi ini digunakan untuk mengalokasikan banyak blok memori. Ini adalah 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 dari 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 di byte pertama dari ruang memori yang dialokasikan dikembalikan.

Setiap kali ada kesalahan mengalokasikan ruang memori seperti kekurangan memori, maka pointer nol dikembalikan.

Contoh calloc ():

Program di bawah ini menghitung jumlah deret aritmatika.

#include 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 termsSum = 45

calloc () vs. malloc (): Perbedaan Utama

Berikut adalah perbedaan utama antara malloc () Vs calloc () di C:

Fungsi calloc () umumnya lebih cocok 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 membutuhkan ruang memori lebih besar.

Blok memori yang dialokasikan oleh calloc () di C selalu diinisialisasi ke nol sedangkan di function malloc () di C, selalu berisi nilai sampah.

Fungsi C realloc ()

Dengan menggunakan fungsi C realloc () , Anda dapat menambahkan lebih banyak ukuran memori ke memori yang telah dialokasikan. Ini memperluas blok saat ini sambil membiarkan konten asli apa adanya. realloc () di C adalah singkatan dari realokasi memori.

realloc () juga dapat digunakan untuk mengurangi ukuran memori yang dialokasikan sebelumnya.

Sintaks dari realloc () Fungsi:

ptr = realloc (ptr,newsize);

Pernyataan di atas mengalokasikan ruang memori baru dengan ukuran tertentu dalam variabel ukuran baru. Setelah menjalankan fungsi tersebut, penunjuk akan dikembalikan ke byte pertama dari blok memori. Ukuran baru 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. Itu memastikan bahwa data akan tetap aman.

Contoh realoc ():

#include 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 sizestrcat(ptr, " In 'C'");printf(" %s, Address = %u\n", ptr, ptr);free(ptr);return 0;} 

Setiap kali realloc () di C menghasilkan operasi yang tidak berhasil, ia mengembalikan pointer nol, dan data sebelumnya juga dibebaskan.

Array Dinamis di C

Array dinamis dalam C memungkinkan jumlah elemen bertambah sesuai kebutuhan. C Array dinamis banyak digunakan dalam algoritma ilmu komputer.

Dalam program berikut, kami telah membuat dan mengubah ukuran array Dinamis di C

#include int main() {int * arr_dynamic = NULL;int elements = 2, i;arr_dynamic = calloc(elements, sizeof(int)); //Array with 2 integer blocksfor (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 elementsprintf("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 array dinamis di layar:

arr_dynamic[0]=0arr_dynamic[1]=1After reallocarr_dynamic[0]=0arr_dynamic[1]=1arr_dynamic[2]=2arr_dynamic[3]=3

Ringkasan

  • Kami dapat mengelola memori secara dinamis dengan membuat blok memori sesuai kebutuhan di heap
  • Dalam C Dynamic Memory Allocation, memori dialokasikan pada saat berjalan.
  • Alokasi memori dinamis memungkinkan untuk memanipulasi string dan array yang ukurannya fleksibel dan dapat diubah kapan saja dalam program Anda.
  • Ini diperlukan ketika Anda tidak tahu berapa banyak memori yang akan ditempati oleh struktur tertentu.
  • Malloc () di C adalah fungsi alokasi memori dinamis yang merupakan singkatan dari alokasi memori yang memblokir memori dengan ukuran tertentu yang diinisialisasi ke nilai sampah
  • Calloc () di C adalah fungsi alokasi memori bersebelahan yang mengalokasikan beberapa blok memori sekaligus diinisialisasi ke 0
  • Realloc () di C digunakan untuk mengalokasikan kembali memori sesuai dengan ukuran yang ditentukan.
  • Fungsi Free () digunakan untuk menghapus memori yang dialokasikan secara dinamis.