calloc vs. malloc

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.

Carta perbandingan

Perbezaan - Persamaan - calloc berbanding carta perbandingan malloc
callocmalloc
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.

Kandungan: calloc vs. malloc

  • 1 Sintaks dan Contoh
    • 1.1 malloc ()
    • 1.2 calloc ()
  • 2 Video Menjelaskan Calloc, Malloc, dan Realloc
  • Pertimbangan keselamatan
  • 4 Kelajuan pelaksanaan
  • 5 Rujukan

Sintaks dan Contoh

malloc ()

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.

calloc ()

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); 

Video Menjelaskan Calloc, Malloc, dan Realloc

Tutorial video ini menerangkan fungsi peruntukan memori malloc, calloc dan realloc, serta fungsi de-peruntukan ingatan percuma:

Pertimbangan keselamatan

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.

Kelajuan pelaksanaan

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.

Rujukan

  • calloc halaman lelaki
  • malloc halaman lelaki