虽然你传入的参数是0,但实际上malloc仍然会为你分配一块4字节的内存(不同编译器可能有不同大小)。就比如你malloc(1),其实得到的内存块大小跟malloc(2)是一样的,这是由内存分配算法决定的。
这么做的原因其实很简单:大部分程序碰到malloc返回NULL的时候,都会认为内存不足,从而去开辟一个新堆或者直接就进入错误处理函数了。为了避免应用程序误判,malloc只要有内存,就一定会返回一个有效指针。
至于为什么是4字节,简单地说是因为考虑到内存分配算法和内存访问效率。这块牵涉到算法和一些硬件方面的知识,你有兴趣的话可以自己去看为什么。