Нет разницы в размере выделенного блока памяти. calloc
просто заполняет блок памяти физическим шаблоном с нулевыми битами. На практике часто предполагается, что объекты, расположенные в блоке памяти, выделенном с помощью calloc
, имеют начальное значение, как если бы они были инициализированы литералом 0
, т. Е. Целые числа должны иметь значение 0
, переменные с плавающей запятой - значение 0.0
, указатели - соответствующее значение нулевого указателя и т. Д.
Тем не менее, с педантичной точки зрения, calloc
(а также memset(..., 0, ...)
) гарантированно правильно инициализирует (с нулями) объекты типа unsigned char
. Все остальное не гарантируется должной инициализацией и может содержать так называемое представление ловушки , которое вызывает неопределенное поведение. Другими словами, для любого типа, отличного от unsigned char
, вышеупомянутая схема «все нули» может представлять недопустимое значение, представление ловушки.
Позже, в одном из стандартов Технических исправлений к C99, поведение было определено для всех целочисленных типов (что имеет смысл). То есть формально в текущем языке C вы можете инициализировать только целочисленные типы с calloc
(и memset(..., 0, ...)
). Использование его для инициализации чего-либо еще в общем случае приводит к неопределенному поведению с точки зрения языка Си.
На практике calloc
работает, как мы все знаем :), но хотите ли вы его использовать (учитывая вышеизложенное), решать только вам. Лично я предпочитаю полностью избегать этого, вместо этого используйте malloc
и выполните мою собственную инициализацию.
Наконец, еще одна важная деталь: calloc
требуется для вычисления окончательного размера блока внутри путем умножения размера элемента на количество элементов. При этом calloc
должен следить за возможным арифметическим переполнением. Это приведет к неудачному распределению (нулевой указатель), если запрошенный размер блока не может быть правильно рассчитан. Между тем, ваша malloc
версия не пытается отслеживать переполнение. В случае переполнения будет выделено некоторое «непредсказуемое» количество памяти.