Стандарт C (C17 7.22.3 / 1) гласит:
Если размер запрошенного пространства равен нулю, поведение определяется реализацией:
либо возвращается нулевой указатель, либо поведение такое, как если бы размер был
ненулевое значение, за исключением того, что возвращенный указатель не должен использоваться для доступа к объекту.
Таким образом, malloc(0)
может вернуть NULL
или действительный указатель , который не может быть разыменован . В любом случае, вполне допустимо звонить free()
на нем.
Я действительно не думаю, что malloc(0)
имеет большое применение, кроме случаев, когда, например, malloc(n)
вызывается в цикле, а n
может быть нулем.
Глядя на код в ссылке, я считаю, что у автора было два заблуждения:
malloc(0)
возвращает действительный указатель всегда и
free(0)
плохо.
Итак, он позаботился о том, чтобы artist
и другие переменные всегда имели какое-то «допустимое» значение в них. В комментарии так много сказано: // these must always point at malloc'd data
.