Calloc vs. Malloc
- 3664
- 628
- Timothy Ankunding
Bila Calloc digunakan untuk memperuntukkan blok memori, rantau yang 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 ingatan tidak dapat diramalkan dan kesilapan pengaturcaraan mungkin mengakibatkan kebocoran kandungan ini.
Carta Perbandingan
Perbezaan - Persamaan -Calloc | Malloc | |
---|---|---|
Fungsi | Memperuntukkan rantau memori yang cukup besar untuk memegang "unsur" saiz "saiz" masing -masing. Juga memulakan kandungan memori kepada sifar. | Peruntukan "saiz" bait ingatan. |
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 | Rantau yang diperuntukkan diasaskan kepada sifar. | Kandungan memori yang diperuntukkan tidak berubah. i.e., Memori mengandungi nilai yang tidak dapat diramalkan atau sampah. Ini memberikan risiko. |
Nilai pulangan | penunjuk tidak sah (tidak sah *). Sekiranya peruntukan berjaya, penunjuk ke blok memori dikembalikan. Sekiranya peruntukan memori gagal, penunjuk null dikembalikan. | penunjuk tidak sah (tidak sah *). Sekiranya peruntukan berjaya, penunjuk ke blok memori dikembalikan. Sekiranya peruntukan memori gagal, penunjuk null dikembalikan. |
Sintaks dan contoh
malloc ()
void *malloc (size_t saiz);
memperuntukkan saiz
bait ingatan. Sekiranya peruntukan berjaya, penunjuk ke memori yang diperuntukkan dikembalikan. Jika tidak Batal
dikembalikan. Contoh:
/* Memperuntukkan 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); /* Peruntukan berjaya. */
Perhatikan bahawa Malloc
Memerlukan kita mengira bait ingatan yang kita perlukan, dan lulus sebagai hujah ke Malloc.
calloc ()
void *calloc (size_t nelements, size_t bytes);
memperuntukkan blok memori yang bersebelahan dengan cukup besar untuk dipegang Nelements
saiz bait
masing -masing. Rantau yang diperuntukkan diasaskan kepada sifar. Dalam contoh di atas:
/* Memperuntukkan ruang untuk array dengan 15 elemen jenis int dan memulakan dengan 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); /* Peruntukan berjaya. */
calloc (m, n) adalah sama seperti
p = malloc (m * n); jika (p) memset (p, 0, m * n);
Video yang menerangkan Calloc, Malloc, dan Realloc
Tutorial video ini menerangkan fungsi peruntukan memori Malloc
, Calloc
dan Realloc
, serta fungsi peruntukan memori percuma
:
Pertimbangan Keselamatan
Secara amnya adalah idea yang baik untuk digunakan Calloc
berakhir Malloc
. Apabila anda menggunakan malloc, kandungan memori yang diperuntukkan tidak dapat diramalkan. Kesalahan pengaturcaraan boleh menyebabkan kandungan memori ini bocor dengan cara yang tidak diingini tetapi sangat terdedah. Contoh yang baik dari kebocoran seperti itu adalah kelemahan yang hangat di OpenSSL, mekanisme asas yang dijelaskan dalam komik XKCD ini dan beberapa butiran teknikal yang lebih banyak ada dalam catatan blog ini.
Kelajuan pelaksanaan
Calloc adalah sedikit lebih perlahan daripada malloc kerana langkah tambahan memulakan rantau memori yang diperuntukkan. Walau bagaimanapun, dalam praktiknya perbezaan kelajuan sangat kecil dan boleh diabaikan.