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..
calloc | malloc | |
---|---|---|
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. |
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.
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);
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
:
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..
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.