Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> Bahasa C

Alokasi Memori Dinamis dalam C menggunakan fungsi malloc(), calloc()

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

Bagaimana Manajemen Memori di C bekerja?

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

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

#include <stdio.h>
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

Juga, array dengan ukuran tertentu dialokasikan dalam blok memori yang berdekatan, setiap blok memiliki ukuran untuk satu elemen:

#include <stdio.h>
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

Seperti yang telah dipelajari sejauh ini, saat mendeklarasikan tipe data dasar atau array, memori secara otomatis dikelola. Namun, ada proses untuk mengalokasikan memori di C yang akan memungkinkan Anda untuk mengimplementasikan program di mana ukuran array tidak ditentukan sampai Anda menjalankan program Anda (runtime). Proses ini disebut “Alokasi memori dinamis .”

Dalam tutorial ini, Anda akan belajar-

Alokasi Memori Dinamis di C

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

Sekarang Anda dapat membuat dan menghancurkan array elemen secara dinamis saat runtime tanpa masalah. Singkatnya, manajemen memori otomatis menggunakan tumpukan, dan Alokasi Memori Dinamis C menggunakan tumpukan.

Pustaka memiliki fungsi yang bertanggung jawab atas Manajemen Memori Dinamis.

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

Mari kita bahas fungsi-fungsi di atas beserta aplikasinya

malloc() fungsi di C

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. Artinya, kita dapat menetapkan fungsi C malloc() ke pointer mana pun.

Sintaks malloc() Fungsi:

ptr = (cast_type *) malloc (byte_size);

Di sini,

Contoh malloc():

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

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

Pertimbangkan contoh lain:

#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

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

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

fungsi gratis() di C

Memori untuk variabel secara otomatis tidak dialokasikan pada waktu kompilasi. Dalam alokasi memori dinamis, Anda harus membatalkan alokasi memori secara eksplisit. Jika tidak dilakukan, Anda mungkin mengalami kesalahan memori.

Gratis() fungsi dipanggil untuk melepaskan/mengalokasikan memori di C. Dengan mengosongkan memori di program Anda, Anda membuat lebih banyak tersedia untuk digunakan nanti.

Misalnya:

#include <stdio.h>
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

fungsi calloc() di C

Fungsi C calloc() adalah singkatan dari alokasi bersebelahan. Fungsi ini digunakan untuk mengalokasikan beberapa blok memori. Ini adalah fungsi alokasi memori dinamis yang digunakan untuk mengalokasikan memori ke struktur data yang kompleks seperti array dan struktur.

Fungsi Malloc() digunakan untuk mengalokasikan satu blok ruang memori sedangkan calloc() dalam C digunakan untuk mengalokasikan beberapa blok ruang memori. Setiap blok yang dialokasikan oleh fungsi calloc() memiliki ukuran yang sama.

Sintaks fungsi calloc():

ptr = (cast_type *) calloc (n, size);

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

Contoh calloc():

Program di bawah ini 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:

Building and calculating the sequence sum of the first 10 terms
Sum = 45

calloc() vs. malloc():Perbedaan Kunci

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

Fungsi calloc() umumnya lebih cocok dan efisien daripada fungsi malloc(). Sementara 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 yang lebih besar.

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

realloc() fungsi di C

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

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

Sintaks fungsi realloc():

ptr = realloc (ptr,newsize);

Pernyataan di atas mengalokasikan ruang memori baru dengan ukuran tertentu dalam variabel ukuran baru. Setelah menjalankan fungsi, pointer 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 <stdio.h>
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 size
   strcat(ptr, " In 'C'");
   printf(" %s,  Address = %u\n", ptr, ptr);
   free(ptr);
   return 0;
}

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

Array Dinamis dalam 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 <stdio.h>
    int main() {
        int * arr_dynamic = NULL;
        int elements = 2, i;
        arr_dynamic = calloc(elements, sizeof(int)); //Array with 2 integer blocks
        for (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 elements
        printf("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 Dynamic array di layar:

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

Ringkasan


Bahasa C

  1. Memori Hanya-Baca (ROM)
  2. C# Input dan Output Dasar
  3. C# menggunakan
  4. Manajemen Memori C++:baru dan hapus
  5. Jenis Fungsi yang Ditentukan Pengguna dalam Pemrograman C
  6. C Alokasi Memori Dinamis
  7. C Fungsi Pustaka Standar
  8. C++ Alokasi Dinamis Array dengan Contoh
  9. Fungsi C++ dengan Contoh Program
  10. C - Fungsi