C Alokasi Memori Dinamis
Alokasi Memori Dinamis C
Dalam tutorial ini, Anda akan belajar mengalokasikan memori secara dinamis dalam program C menggunakan fungsi library standar:malloc(), calloc(), free() dan realloc().
Seperti yang Anda ketahui, array adalah kumpulan dari sejumlah nilai yang tetap. Setelah ukuran array dideklarasikan, Anda tidak dapat mengubahnya.
Terkadang ukuran array yang Anda nyatakan mungkin tidak mencukupi. Untuk mengatasi masalah ini, Anda dapat mengalokasikan memori secara manual selama run-time. Ini dikenal sebagai alokasi memori dinamis dalam pemrograman C.
Untuk mengalokasikan memori secara dinamis, fungsi library adalah malloc()
, calloc()
, realloc()
dan free()
digunakan. Fungsi-fungsi ini didefinisikan dalam <stdlib.h>
file header.
C malloc()
Nama "malloc" adalah singkatan dari alokasi memori.
malloc()
fungsi cadangan blok memori dari jumlah byte yang ditentukan. Dan, ia mengembalikan pointer void
yang dapat dicor menjadi pointer dalam bentuk apa pun.
Sintaks malloc()
ptr = (castType*) malloc(size);
Contoh
ptr = (float*) malloc(100 * sizeof(float));
Pernyataan di atas mengalokasikan 400 byte memori. Itu karena ukuran float
adalah 4 byte. Dan, penunjuk ptr menyimpan alamat byte pertama dalam memori yang dialokasikan.
Ekspresi menghasilkan NULL
pointer jika memori tidak dapat dialokasikan.
C calloc()
Nama "calloc" adalah singkatan dari contiguous alokasi.
malloc()
fungsi mengalokasikan memori dan membiarkan memori tidak diinisialisasi, sedangkan calloc()
fungsi mengalokasikan memori dan menginisialisasi semua bit ke nol.
Sintaks calloc()
ptr = (castType*)calloc(n, size);
Contoh:
ptr = (float*) calloc(25, sizeof(float));
Pernyataan di atas mengalokasikan ruang yang berdekatan dalam memori untuk 25 elemen tipe float
.
C gratis()
Memori yang dialokasikan secara dinamis dibuat dengan calloc()
atau malloc()
tidak dibebaskan dengan sendirinya. Anda harus secara eksplisit menggunakan free()
untuk melepaskan ruang.
Sintaks gratis()
free(ptr);
Pernyataan ini membebaskan ruang yang dialokasikan dalam memori yang ditunjukkan oleh ptr
.
Contoh 1:malloc() dan free()
// Program to calculate the sum of n numbers entered by the user
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, i, *ptr, sum = 0;
printf("Enter number of elements: ");
scanf("%d", &n);
ptr = (int*) malloc(n * sizeof(int));
// if memory cannot be allocated
if(ptr == NULL) {
printf("Error! memory not allocated.");
exit(0);
}
printf("Enter elements: ");
for(i = 0; i < n; ++i) {
scanf("%d", ptr + i);
sum += *(ptr + i);
}
printf("Sum = %d", sum);
// deallocating the memory
free(ptr);
return 0;
}
Keluaran
Enter number of elements: 3
Enter elements: 100
20
36
Sum = 156
Di sini, kami telah mengalokasikan memori secara dinamis untuk n jumlah int
.
Contoh 2:calloc() dan free()
// Program to calculate the sum of n numbers entered by the user
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, i, *ptr, sum = 0;
printf("Enter number of elements: ");
scanf("%d", &n);
ptr = (int*) calloc(n, sizeof(int));
if(ptr == NULL) {
printf("Error! memory not allocated.");
exit(0);
}
printf("Enter elements: ");
for(i = 0; i < n; ++i) {
scanf("%d", ptr + i);
sum += *(ptr + i);
}
printf("Sum = %d", sum);
free(ptr);
return 0;
}
Keluaran
Enter number of elements: 3
Enter elements: 100
20
36
Sum = 156
C realloc()
Jika memori yang dialokasikan secara dinamis tidak mencukupi atau lebih dari yang dibutuhkan, Anda dapat mengubah ukuran memori yang dialokasikan sebelumnya menggunakan realloc()
fungsi.
Sintaks realloc()
ptr = realloc(ptr, x);
Di sini, ptr dialokasikan kembali dengan ukuran baru x .
Contoh 3:realloc()
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr, i , n1, n2;
printf("Enter size: ");
scanf("%d", &n1);
ptr = (int*) malloc(n1 * sizeof(int));
printf("Addresses of previously allocated memory:\n");
for(i = 0; i < n1; ++i)
printf("%pc\n",ptr + i);
printf("\nEnter the new size: ");
scanf("%d", &n2);
// rellocating the memory
ptr = realloc(ptr, n2 * sizeof(int));
printf("Addresses of newly allocated memory:\n");
for(i = 0; i < n2; ++i)
printf("%pc\n", ptr + i);
free(ptr);
return 0;
}
Keluaran
Enter size: 2
Addresses of previously allocated memory:
26855472
26855476
Enter the new size: 4
Addresses of newly allocated memory:
26855472
26855476
26855480
26855484