Bila calloc digunakan untuk memperuntukkan blok ingatan, rantau diperuntukkan diasaskan kepada sifar. Berbeza, malloc tidak menyentuh kandungan blok memori yang diperuntukkan, yang bermaksud ia mengandungi nilai sampah. Ini berpotensi menjadi risiko keselamatan kerana kandungan memori tidak dapat diprediksi dan kesalahan pengaturcaraan boleh mengakibatkan kebocoran kandungan ini.
calloc | malloc | |
---|---|---|
Fungsi | memperuntukkan kawasan ingatan yang cukup besar untuk memegang "n elemen" setiap bait "saiz". Juga mulakan kandungan memori ke sifar. | memperuntukkan bait memori "saiz". |
Bilangan hujah | 2 | 1 |
Sintaks | void * calloc (number_of_blocks, size_of_each_block_in_bytes); | void * malloc (size_in_bytes); |
Kandungan memori yang diperuntukkan | Rangkaian diperuntukkan diasaskan kepada sifar. | Kandungan memori yang diperuntukkan tidak berubah. iaitu, ingatan mengandungi nilai yang tidak dapat diramalkan atau sampah. Ini memberi risiko. |
Pulangan nilai | void pointer (void *). Jika peruntukan berjaya, penuding ke blok memori dikembalikan. Jika peruntukan memori gagal, penunjuk NULL dikembalikan. | void pointer (void *). Jika peruntukan berjaya, penuding ke blok memori dikembalikan. Jika peruntukan memori gagal, penunjuk NULL dikembalikan. |
void * malloc (size_t size);
memperuntukkan saiz
bait ingatan. Sekiranya peruntukan berjaya, penunjuk kepada memori yang diperuntukkan akan dikembalikan. Jika tidak NULL
dikembalikan. Contoh:
/ * Alihkan memori untuk array dengan 15 elemen jenis int. * / int * ptr = malloc (15 * sizeof (int)); jika (ptr == NULL) / * Memori tidak dapat diperuntukkan, jadi cetak ralat dan keluar. * / fprintf (stderr, "Tidak dapat memperuntukkan memori \ n"); keluar (EXIT_FAILURE); / * Alokasi berjaya. * /
Perhatikan bahawa malloc
memerlukan kita menghitung bait memori yang kita perlukan, dan lulus sebagai hujah kepada malloc.
void * calloc (size_t nelements, size_t bytes);
memperuntukkan memori bersambung yang cukup besar untuk dipegang nelayan
saiz bait
setiap. Rangkaian diperuntukkan diasaskan kepada sifar. Dalam contoh di atas:
/ * Alihkan ruang untuk array dengan 15 elemen jenis int dan permulaan kepada sifar. * / int * ptr = calloc (15, sizeof (int)); jika (ptr == NULL) / * Memori tidak dapat diperuntukkan, jadi cetak ralat dan keluar. * / fprintf (stderr, "Tidak dapat memperuntukkan memori \ n"); keluar (EXIT_FAILURE); / * Alokasi berjaya. * /
calloc (m, n) adalah sama dengan
p = malloc (m * n); jika (p) memset (p, 0, m * n);
Tutorial video ini menerangkan fungsi peruntukan memori malloc
, calloc
dan realloc
, serta fungsi de-peruntukan ingatan percuma
:
Ia biasanya idea yang baik untuk digunakan calloc
lebih malloc
. Apabila anda menggunakan malloc, kandungan memori yang diperuntukkan tidak dapat diramalkan. Kesilapan pemrograman boleh menyebabkan kandungan ingatan ini bocor dengan cara yang tidak diingini tetapi sangat mudah terjejas. Satu contoh yang baik kebocoran sedemikian adalah kelemahan Heartbleed dalam OpenSSL, mekanisme asas yang diterangkan dalam komik XKCD ini dan beberapa butir-butir yang lebih teknikal di dalam blog post ini.
calloc adalah sedikit lebih perlahan daripada malloc kerana langkah tambahan menginisialisasi rantau memori yang diperuntukkan. Bagaimanapun, dalam amalan perbezaan kelajuan sangat kecil dan boleh diabaikan.