Calloc vs. Malloc

Calloc vs. Malloc

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 versus carta perbandingan malloc
CallocMalloc
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.