Sebelum anda mempelajari peruntukan C Dynamic Memory, mari kita fahami:
Bagaimana Pengurusan Memori dalam C berfungsi?
Apabila anda menyatakan pemboleh ubah menggunakan jenis data asas, penyusun C secara automatik memperuntukkan ruang memori untuk pemboleh ubah dalam kumpulan memori yang disebut timbunan .
Sebagai contoh, pemboleh ubah apungan biasanya mengambil masa 4 bait (mengikut platform) apabila dinyatakan. Kami dapat mengesahkan maklumat ini menggunakan ukuran operator seperti yang ditunjukkan dalam contoh di bawah
#includeint main() { float x; printf("The size of float is %d bytes", sizeof(x)); return 0;}
Hasilnya adalah:
The size of float is 4 bytes
Juga, susunan dengan ukuran yang ditentukan diperuntukkan dalam blok memori bersebelahan, setiap blok mempunyai ukuran untuk satu elemen:
#includeint 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 dipelajari sejauh ini, ketika menyatakan jenis data asas atau array, memori akan diuruskan secara automatik. Namun, ada proses untuk mengalokasikan memori dalam C yang akan memungkinkan Anda untuk melaksanakan program di mana ukuran array tidak ditentukan sehingga anda menjalankan program (runtime). Proses ini dipanggil " Peruntukan memori dinamik ."
Dalam tutorial ini, anda akan belajar-
- Bagaimana Pengurusan Memori dalam C berfungsi?
- Peruntukan Memori Dinamik di C
- F malloc () Fungsi
- Fungsi () percuma
- C calloc () Fungsi
- calloc () vs malloc (): Perbezaan Utama
- C realloc () Fungsi
- Susunan Dinamik
Peruntukan Memori Dinamik di C
Dynamic Memory Allocation adalah peruntukan manual dan pembebasan memori mengikut keperluan pengaturcaraan anda. Memori dinamik diuruskan dan disajikan dengan petunjuk yang menunjukkan ruang memori yang baru diperuntukkan di kawasan yang kita namakan timbunan.
Sekarang anda boleh membuat dan memusnahkan pelbagai elemen secara dinamik semasa menjalankan tanpa masalah. Ringkasnya, pengurusan memori automatik menggunakan timbunan, dan C Dynamic Memory Allocation menggunakan timbunan.
Perpustakaan
Fungsi | Tujuan |
malloc () | Memperuntukkan memori ukuran yang diminta dan mengembalikan penunjuk ke bait pertama ruang yang diperuntukkan. |
calloc () | Memperuntukkan ruang untuk elemen larik. Memulakan elemen ke sifar dan mengembalikan penunjuk ke memori. |
pasang semula () | Ia digunakan untuk mengubah ukuran ruang memori yang diperuntukkan sebelumnya. |
Percuma () | Membebaskan atau mengosongkan ruang memori yang diperuntukkan sebelumnya. |
Mari kita bincangkan fungsi di atas dengan aplikasi mereka
F malloc () Fungsi
Fungsi C malloc () bermaksud peruntukan memori. Ini adalah fungsi yang digunakan untuk mengalokasikan blok memori secara dinamis. Ia menyimpan ruang memori dengan ukuran yang ditentukan dan mengembalikan penunjuk nol yang menunjuk ke lokasi memori. Penunjuk yang dikembalikan biasanya tidak sah. Ini bermaksud bahawa kita dapat menetapkan fungsi C malloc () ke penunjuk mana pun.
Fungsi sintaks malloc ():
ptr = (cast_type *) malloc (byte_size);
Di sini,
- ptr adalah penunjuk jenis cor_type.
- Fungsi C malloc () mengembalikan penunjuk ke memori byte_size yang diperuntukkan.
Contoh malloc ():
Example: ptr = (int *) malloc (50)
Apabila pernyataan ini berjaya dilaksanakan, ruang memori 50 bait dikhaskan. Alamat bait pertama dari ruang simpanan ditugaskan ke penunjuk ptr jenis int.
Pertimbangkan contoh lain:
#includeint 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));}}
Pengeluaran:
Value of the 6th integer is 480
- Perhatikan bahawa sizeof (* ptr) digunakan dan bukan sizeof (int) untuk membuat kod lebih mantap ketika * deklarasi ptr ditaip ke jenis data yang lain kemudian.
- Peruntukan mungkin gagal sekiranya memori tidak mencukupi. Dalam kes ini, ia mengembalikan penunjuk NULL. Jadi, anda mesti memasukkan kod untuk memeriksa penunjuk NULL.
- Perlu diingat bahawa memori yang dialokasikan bersebelahan dan dapat dianggap sebagai array. Kita boleh menggunakan aritmetik penunjuk untuk mengakses elemen array daripada menggunakan tanda kurung []. Kami menyarankan untuk menggunakan + untuk merujuk pada elemen array kerana menggunakan kenaikan ++ atau + = mengubah alamat yang disimpan oleh penunjuk.
Fungsi Malloc () juga dapat digunakan dengan jenis data watak dan juga jenis data yang kompleks seperti struktur.
Fungsi () percuma
Memori untuk pemboleh ubah secara automatik dialokasikan pada waktu kompilasi. Dalam peruntukan memori dinamik, anda harus membuang memori secara eksplisit. Sekiranya tidak selesai, anda mungkin mengalami kesilapan ingatan.
Fungsi bebas () dipanggil untuk melepaskan / menyahpindah memori dalam C. Dengan membebaskan memori dalam program anda, anda akan menyediakan lebih banyak lagi untuk digunakan kemudian.
Sebagai contoh:
#includeint 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);}
Pengeluaran
Value of the 2nd integer is 50
C calloc () Fungsi
Fungsi C calloc () bermaksud peruntukan bersebelahan. Fungsi ini digunakan untuk memperuntukkan banyak blok memori. Ini adalah fungsi peruntukan memori dinamik yang digunakan untuk mengalokasikan memori ke struktur data yang kompleks seperti susunan dan struktur.
Fungsi Malloc () digunakan untuk memperuntukkan satu blok ruang memori sementara calloc () dalam C digunakan untuk memperuntukkan beberapa blok ruang memori. Setiap blok yang diperuntukkan oleh fungsi calloc () mempunyai ukuran yang sama.
Fungsi sintaks calloc ():
ptr = (cast_type *) calloc (n, size);
- Pernyataan di atas digunakan untuk memperuntukkan n blok memori dengan ukuran yang sama.
- Setelah ruang memori diperuntukkan, maka semua bait dimulakan menjadi sifar.
- Penunjuk yang kini berada pada bait pertama ruang memori yang diperuntukkan dikembalikan.
Apabila terdapat ralat memperuntukkan ruang memori seperti kekurangan memori, maka penunjuk kosong akan dikembalikan.
Contoh calloc ():
Program di bawah ini mengira jumlah turutan aritmetik.
#includeint 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;}
Keputusan:
Building and calculating the sequence sum of the first 10 termsSum = 45
calloc () vs malloc (): Perbezaan Utama
Berikut adalah perbezaan utama antara malloc () Vs calloc () dalam C:
Fungsi calloc () secara amnya lebih sesuai dan efisien daripada fungsi malloc (). Walaupun kedua fungsi tersebut digunakan untuk memperuntukkan ruang memori, calloc () dapat mengalokasikan banyak blok pada satu masa. Anda tidak perlu meminta blok memori setiap masa. Fungsi calloc () digunakan dalam struktur data kompleks yang memerlukan ruang memori yang lebih besar.
Blok memori yang dialokasikan oleh calloc () di C selalu diinisialisasi menjadi nol sementara di malloc fungsi () di C, ia selalu berisi nilai sampah.
C realloc () Fungsi
Dengan menggunakan fungsi C realloc () , anda dapat menambahkan lebih banyak ukuran memori ke memori yang telah diperuntukkan. Ia mengembangkan blok semasa sambil meninggalkan kandungan aslinya sebagaimana adanya. realloc () dalam C bermaksud pengagihan semula memori.
realloc () juga boleh digunakan untuk mengurangkan ukuran memori yang diperuntukkan sebelumnya.
Fungsi sintaks realloc ():
ptr = realloc (ptr,newsize);
Pernyataan di atas memperuntukkan ruang memori baru dengan ukuran yang ditentukan dalam pembolehubah berita. Setelah menjalankan fungsi, penunjuk akan dikembalikan ke bait pertama blok memori. Saiz baru boleh lebih besar atau lebih kecil daripada memori sebelumnya. Kami tidak pasti bahawa jika blok yang baru diperuntukkan akan menunjuk ke lokasi yang sama dengan blok memori sebelumnya. Fungsi ini akan menyalin semua data sebelumnya di wilayah baru. Ini memastikan bahawa data akan tetap selamat.
Contoh realloc ():
#includeint 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;}
Apabila realloc () di C menghasilkan operasi yang tidak berjaya, ia mengembalikan penunjuk nol, dan data sebelumnya juga dibebaskan.
Susunan Dinamik di C
Susunan dinamik dalam C membolehkan bilangan elemen berkembang mengikut keperluan. C Dynamic array banyak digunakan dalam algoritma sains Komputer.
Dalam program berikut, kami telah membuat dan mengubah ukuran array Dinamik di C
#includeint 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 array Dynamic C di skrin:
arr_dynamic[0]=0arr_dynamic[1]=1After reallocarr_dynamic[0]=0arr_dynamic[1]=1arr_dynamic[2]=2arr_dynamic[3]=3
Ringkasan
- Kita dapat menguruskan memori secara dinamis dengan membuat blok memori seperti yang diperlukan di timbunan
- Dalam C Dynamic Memory Allocation, memori diperuntukkan pada masa berjalan.
- Peruntukan memori dinamik memungkinkan untuk memanipulasi rentetan dan tatasusunan yang ukurannya fleksibel dan boleh diubah bila-bila masa dalam program anda.
- Ia diperlukan apabila anda tidak tahu berapa banyak memori yang akan ditempati oleh struktur tertentu.
- Malloc () dalam C adalah fungsi peruntukan memori dinamis yang bermaksud alokasi memori yang menyekat memori dengan ukuran tertentu yang diinisialisasi menjadi nilai sampah
- Calloc () dalam C adalah fungsi peruntukan memori bersebelahan yang mengalokasikan banyak blok memori pada masa yang diinisialisasi menjadi 0
- Realloc () dalam C digunakan untuk mengalokasikan semula memori mengikut ukuran yang ditentukan.
- Fungsi bebas () digunakan untuk membersihkan memori yang diperuntukkan secara dinamik.