C Peruntukan Memori Dinamik Menggunakan malloc (), calloc (), free () & realloc ()

Dalam tutorial ini, anda akan belajar mengalokasikan memori secara dinamik dalam program C anda menggunakan fungsi perpustakaan standard: malloc (), calloc (), free () dan realloc ().

Seperti yang anda ketahui, tatasusunan adalah kumpulan sejumlah nilai tetap. Setelah ukuran array dinyatakan, anda tidak boleh mengubahnya.

Kadang kala ukuran susunan yang anda nyatakan mungkin tidak mencukupi. Untuk menyelesaikan masalah ini, anda boleh memperuntukkan memori secara manual semasa jangka masa berjalan. Ini dikenali sebagai peruntukan memori dinamik dalam pengaturcaraan C.

Untuk memperuntukkan secara dinamik memori, fungsi perpustakaan adalah malloc(), calloc(), realloc()dan free()digunakan. Fungsi-fungsi ini ditentukan dalam fail header.

C malloc ()

Nama "malloc" bermaksud peruntukan memori.

Yang malloc()fungsi menyimpan satu blok ingatan jumlah tertentu bait. Dan, ia mengembalikan penunjuk voidyang boleh dijadikan petunjuk dalam bentuk apa pun.

Sintaks malloc ()

 ptr = (castType*) malloc(size);

Contohnya

 ptr = (float*) malloc(100 * sizeof(float));

Pernyataan di atas memperuntukkan 400 bait memori. Ini kerana saiznya floatialah 4 bait. Dan, penunjuk ptr menyimpan alamat bait pertama dalam memori yang diperuntukkan.

Ekspresi menghasilkan NULLpenunjuk jika memori tidak dapat dialokasikan.

C calloc ()

Nama "calloc" bermaksud peruntukan yang bersebelahan.

The malloc()Peruntuk fungsi ingatan dan daun memori tidak diisytiharkan. Manakala, calloc()fungsi memperuntukkan memori dan memulakan semua bit hingga sifar.

Sintaks calloc ()

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

Contoh:

 ptr = (float*) calloc(25, sizeof(float));

Pernyataan di atas memperuntukkan ruang bersebelahan dalam memori untuk 25 elemen jenis float.

C percuma ()

Memori yang diperuntukkan secara dinamik dibuat dengan mana-mana calloc()atau malloc()tidak dibebaskan sendiri. Anda mesti menggunakan secara jelas free()untuk melepaskan ruang.

Sintaks percuma ()

 free(ptr);

Pernyataan ini membebaskan ruang yang diperuntukkan dalam memori yang ditunjukkan oleh ptr.

Contoh 1: malloc () dan percuma ()

 // Program to calculate the sum of n numbers entered by the user #include #include 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; ) 

Di sini, kami telah mengalihkan memori secara dinamik untuk bilangan n int.

Contoh 2: calloc () dan percuma ()

 // Program to calculate the sum of n numbers entered by the user #include #include 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; ) 

C realloc ()

Sekiranya memori yang diperuntukkan secara dinamik tidak mencukupi atau lebih daripada yang diperlukan, anda boleh mengubah ukuran memori yang diperuntukkan sebelumnya menggunakan realloc()fungsi tersebut.

Sintaks realloc ()

 ptr = realloc(ptr, x);

Di sini, ptr dialokasikan semula dengan ukuran x yang baru.

Contoh 3: realloc ()

 #include #include 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: "); for(i = 0; i < n1; ++i) printf("%u",ptr + i); printf("Enter the new size: "); scanf("%d", &n2); // rellocating the memory ptr = realloc(ptr, n2 * sizeof(int)); printf("Addresses of newly allocated memory: "); for(i = 0; i < n2; ++i) printf("%u", ptr + i); free(ptr); return 0; )

Semasa anda menjalankan program, outputnya adalah:

 Masukkan saiz: 2 Alamat memori yang diperuntukkan sebelumnya: 26855472 26855476 Masukkan saiz baru: 4 Alamat memori yang baru diperuntukkan: 26855472 26855476 26855480 26855484

Artikel menarik...