Es gibt keinen Unterschied in der Größe des zugewiesenen Speicherblocks. calloc
Füllt einfach den Speicherblock mit einem physischen All-Null-Bit-Muster. In der Praxis wird häufig angenommen, dass die Objekte in dem mit zugewiesenen Speicherblock calloc
einen Anfangswert haben, als ob sie mit einem Literal initialisiert worden wären 0
, dh Ganzzahlen sollten den Wert von 0
Gleitkommavariablen - Wert von 0.0
Zeigern - den entsprechenden Nullzeigerwert haben , und so weiter.
Aus pedantischer Sicht wird jedoch calloc
(wie auch memset(..., 0, ...)
) nur garantiert, dass Objekte vom Typ (mit Nullen) ordnungsgemäß initialisiert werden unsigned char
. Es wird nicht garantiert, dass alles andere ordnungsgemäß initialisiert wird, und es kann eine sogenannte Trap-Darstellung enthalten , die zu undefiniertem Verhalten führt. Mit anderen Worten, für jeden anderen Typ als unsigned char
das oben erwähnte All-Null-Bit-Muster könnte ein unzulässiger Wert eine Trap-Darstellung darstellen.
Später wurde in einer der technischen Berichtigungen zum C99-Standard das Verhalten für alle Ganzzahltypen definiert (was sinnvoll ist). Das heißt, formal können Sie in der aktuellen C-Sprache nur ganzzahlige Typen mit calloc
(und memset(..., 0, ...)
) initialisieren . Die Verwendung zum Initialisieren von anderen Elementen im allgemeinen Fall führt aus Sicht der C-Sprache zu undefiniertem Verhalten.
In der Praxis calloc
funktioniert, wie wir alle wissen :), aber ob Sie es verwenden möchten (unter Berücksichtigung der oben genannten), liegt bei Ihnen. Ich persönlich bevorzuge es, es vollständig zu vermeiden, malloc
stattdessen zu verwenden und meine eigene Initialisierung durchzuführen.
Schließlich ist ein weiteres wichtiges Detail calloc
erforderlich, um die endgültige Blockgröße intern zu berechnen , indem die Elementgröße mit der Anzahl der Elemente multipliziert wird. Achten Sie dabei calloc
auf einen möglichen arithmetischen Überlauf. Dies führt zu einer nicht erfolgreichen Zuordnung (Nullzeiger), wenn die angeforderte Blockgröße nicht korrekt berechnet werden kann. In der Zwischenzeit malloc
unternimmt Ihre Version keinen Versuch, auf Überlauf zu achten. Für den Fall eines Überlaufs wird eine "unvorhersehbare" Speichermenge zugewiesen.
malloc
Familie