malloc(0) の動作は処理系依存であり、NULL を返すかユニークなポインタを返すかのいずれかになる (ISO/IEC 9899:1990 7.10.3)。処理系に依存するため、特定の動作を期待したプログラムは書かない方が良いだろう。

ちなみに、malloc(0) がユニークなポインタを返す場合は、malloc() がふつうに返すポインタと同じで、malloc() が管理する領域に "少なくとも 0 バイト" の領域を作ってその先頭のアドレスを返すだけである。NULL を返さない理由としては、

n バイトの領域を確保する
その n バイトの領域を使う
最後にその n バイトの領域を解放する
という一連の処理で、n が 0 か 1 以上かで場合分けしなくてすむようになるから、というのが考えられる。