Обработка нулевых указателей и запросов на выделение нулевой длины в определении этих функций частично была обусловлена желанием поддержать эту парадигму:
OBJ * p; // pointer to a variable list of OBJs
/* initial allocation */
p = (OBJ *) calloc(0, sizeof(OBJ));
/* ... */
/* reallocations until size settles */
while(1) {
p = (OBJ *) realloc((void *)p, c * sizeof(OBJ));
/* change value of c or break out of loop */
}
Сообщается, что этот стиль кодирования, не обязательно одобренный Комитетом, широко используется.
Некоторые реализации возвращали ненулевые значения для запросов на выделение нулевых байтов.
Хотя эта стратегия имеет теоретическое преимущество, заключающаяся в различении «ничего» и «нуля» (нераспределенный указатель и указатель на пространство нулевой длины), она имеет более убедительный теоретический недостаток, заключающийся в необходимости концепции объекта нулевой длины.
Поскольку такие объекты не могут быть объявлены библиотекой, единственный способ, которым они могли бы появиться, был бы через такие запросы выделения.
Комитет С89 решил не принимать идею объектов нулевой длины. Распределение
поэтому функции могут возвращать нулевой указатель для запроса на выделение нулевых байтов. Обратите внимание, что это лечение не исключает изложенную выше парадигму.
ТИХОЕ ИЗМЕНЕНИЕ В C89 : Программа, которая опирается на запросы выделения нулевого размера, возвращающие ненулевой указатель, будет вести себя по-другому.