Почему calloc выделяет 1 байт, если nelem или elsize == ноль?
Для уменьшения неоднозначности.
calloc(0, x), calloc(x, 0), malloc(0)
, в случае успеха может вернуть NULL
или не NULL
указатель. В обоих случаях указатель не может быть отменен без указания неопределенного поведения (UB).
В случае неудачи возвращается указатель NULL
.
Byпри условии, что размер выделения больше 0, неопределенность при возврате NULL
отсутствует - выделение не удалось из this calloc()
.
Обратите внимание, что лучшая функция будеттакже обнаружить переполнение продукта.
if (nelem == 0 || elsize == 0) {
nelem = elsize = 1;
} else if (SIZE_MAX/nelem > elsize) {
return NULL; // Too much for this implementation
}
...
Дальнейшие размышления о Electric_Fence :
Я бы ожидал, что malloc(0)
этого проекта также обеспечит 0байты не выделены. Тем не менее, простой вызов ptr = malloc (0); if (ptr) bzero (ptr, 0);
не приведет к обнулению распределения в 1 байт. if (nelem == 0 || elsize == 0) nelem = elsize = 1;
гарантирует, что выделение составляет не менее 1 байта и , что выделение обнуляется.