Tidak ada perbedaan dalam ukuran blok memori yang dialokasikan. calloc
hanya mengisi blok memori dengan pola fisik semua-nol-bit. Dalam praktiknya sering diasumsikan bahwa objek yang terletak di blok memori yang dialokasikan dengan calloc
nilai initilial seolah-olah mereka diinisialisasi dengan literal 0
, yaitu integer harus memiliki nilai 0
, variabel floating-point - nilai 0.0
, pointer - nilai null-pointer yang sesuai , dan seterusnya.
Dari sudut pandang pedantic, calloc
(dan juga memset(..., 0, ...)
) hanya dijamin untuk menginisialisasi objek (dengan nol) dengan benar unsigned char
. Segala sesuatu yang lain tidak dijamin diinisialisasi dengan benar dan mungkin mengandung apa yang disebut representasi perangkap , yang menyebabkan perilaku tidak terdefinisi. Dengan kata lain, untuk semua tipe selain unsigned char
patterma semua-nol-bit yang disebutkan di atas mungkin mewakili nilai ilegal, representasi trap.
Kemudian, di salah satu Teknis Corrigenda ke standar C99, perilaku didefinisikan untuk semua tipe integer (yang masuk akal). Yaitu secara formal, dalam bahasa C saat ini Anda hanya dapat menginisialisasi tipe integer dengan calloc
(dan memset(..., 0, ...)
). Menggunakannya untuk menginisialisasi hal lain dalam kasus umum mengarah ke perilaku yang tidak terdefinisi, dari sudut pandang bahasa C.
Dalam praktiknya, calloc
berfungsi, seperti yang kita semua ketahui :), tetapi apakah Anda ingin menggunakannya (mengingat di atas) terserah Anda. Saya pribadi lebih suka menghindarinya sepenuhnya, gunakan malloc
saja dan lakukan inisialisasi saya sendiri.
Akhirnya, detail penting lainnya adalah yang calloc
diperlukan untuk menghitung ukuran blok akhir secara internal , dengan mengalikan ukuran elemen dengan jumlah elemen. Saat melakukan itu, calloc
harus memperhatikan kemungkinan aritmatika meluap. Ini akan menghasilkan alokasi yang gagal (pointer nol) jika ukuran blok yang diminta tidak dapat dihitung dengan benar. Sementara itu, malloc
versi Anda tidak berusaha untuk menonton meluap. Ini akan mengalokasikan sejumlah memori yang "tidak dapat diprediksi" jika terjadi overflow.
malloc
keluarga