malloc (0) вернет NULL или верный указатель, который можно по праву передать свободному. И хотя кажется, что память, на которую он указывает, бесполезна или не может быть записана или прочитана, это не всегда так. :)
int *i = malloc(0);
*i = 100;
printf("%d", *i);
Мы ожидаем ошибки сегментации здесь, но удивительно, что это печатает 100! Это потому, что malloc фактически запрашивает огромный кусок памяти, когда мы вызываем malloc впервые. Каждый последующий вызов malloc использует память из этого большого блока. Только после того, как этот огромный кусок закончен, запрашивается новая память.
Использование malloc (0): если вы хотите, чтобы последующие вызовы malloc были более быстрыми, вызов malloc (0) должен сделать это за вас (за исключением крайних случаев).