calloc ve malloc karşılaştırması

Ne zaman calloc bir bellek bloğu tahsis etmek için kullanılır, tahsis edilen bölge sıfırlanır. Tersine, malloc ayrılan bellek bloğunun içeriğine dokunmaz, yani çöp değerleri içerir. Bellek içeriği öngörülemediğinden ve programlama hataları bu içeriklerin sızmasına neden olabileceğinden, bu potansiyel olarak bir güvenlik riski oluşturabilir..

Karşılaştırma Tablosu

Farklılıklar - Benzerlikler - calloc ve malloc karşılaştırma tablosu
callocmalloc
fonksiyon her biri "boyut" bayt "n element" tutacak kadar büyük bir bellek bölgesi tahsis eder. Ayrıca bellek içeriğini sıfırlar. "boyut" bayt bellek ayırır.
Argüman sayısı 2 1
Sözdizimi void * calloc (blok_sayısı_sayısı, her biri_karaktar_bir_birim_baytı) geçersiz * malloc (size_in_bytes);
Ayrılan belleğin içeriği Tahsis edilen bölge sıfırlandı. Ayrılan belleğin içeriği değiştirilmez. yani, bellek tahmin edilemeyen veya çöp değerleri içerir. Bu bir risk oluşturur.
Geri dönüş değeri geçersiz işaretçi (geçersiz *). Ayırma başarılı olursa, bellek bloğuna bir işaretçi döndürülür. Bellek ayırma başarısız olursa, bir NULL işaretçisi döndürülür. geçersiz işaretçi (geçersiz *). Ayırma başarılı olursa, bellek bloğuna bir işaretçi döndürülür. Bellek ayırma başarısız olursa, bir NULL işaretçisi döndürülür.

İçindekiler: calloc vs. malloc

  • 1 Sözdizimi ve Örnekler
    • 1.1 malloc ()
    • 1.2 calloc ()
  • 2 Calloc, Malloc ve Realloc'u Açıklayan Video
  • 3 Güvenlikle ilgili konular
  • 4 Uygulama hızı
  • 5 Kaynakça

Sözdizimi ve Örnekler

Malloc ()

geçersiz * malloc (boyut_t boyut); 

özgüler boyut bayt bellek. Ayırma başarılı olursa, ayrılan belleğe bir işaretçi döndürülür. Aksi takdirde BOŞ Geri döndü. Misal:

/ * 15 öğeden oluşan bir dizi için bellek ayırma int. * / int * ptr = malloc (15 * sizeof (int)); if (ptr == NULL) / * Bellek ayrılamadı, bu nedenle bir hata yazdırın ve çıkın. * / fprintf (stderr, "Bellek ayrılamadı \ n"); çıkış (EXIT_FAILURE);  / * Atama başarılı. * / 

Bunu not et malloc ihtiyaç duyduğumuz hafızanın baytlarını hesaplamamızı ve bunu malloc'a bir argüman olarak aktarmamızı gerektirir.

calloc ()

void * calloc (boyut_t öğeleri, boyut_t bayt); 

tutmak için yeterince büyük bir bitişik bellek bloğu tahsis eder Nelements büyüklüğünde bayt her biri. Tahsis edilen bölge sıfırlanır. Yukarıdaki örnekte:

/ * 15 öğe türünden oluşan bir dizi için alan ayırma int ve sıfıra sıfırlayın. * / int * ptr = calloc (15, sizeof (int)); if (ptr == NULL) / * Bellek ayrılamadı, bu nedenle bir hata yazdırın ve çıkın. * / fprintf (stderr, "Bellek ayrılamadı \ n"); çıkış (EXIT_FAILURE);  / * Atama başarılı. * / 

calloc (m, n) ile aynı

p = malloc (m * n); eğer (p) memset (p, 0, m * n); 

Video Açıklama Calloc, Malloc ve Realloc

Bu video eğitiminde bellek ayırma işlevleri açıklanmaktadır malloc, calloc ve realloc, bellek ayırma işlevinin yanı sıra Bedava:

Güvenlik Hususları

Kullanmak genellikle iyi bir fikirdir calloc bitmiş malloc. Malloc kullandığınızda, ayrılan belleğin içeriği önceden kestirilemez. Programlama hataları, bu bellek içeriğinin istenmeyen ancak oldukça savunmasız yollarla sızmasına neden olabilir. Böyle bir sızıntının iyi bir örneği, temel mekanizması bu XKCD çizgi romanında açıklanan ve bazı daha teknik detaylar bu blog yazısında bulunan OpenSSL'deki Heartbleed güvenlik açığıdır..

Uygulama hızı

Calloc, tahsis edilen bellek bölgesini başlatmanın fazladan adımı nedeniyle malloc'dan biraz daha yavaştır. Bununla birlikte, pratikte hız farkı çok küçüktür ve göz ardı edilebilir.

Referanslar

  • calloc adam sayfası
  • malloc adam sayfası