谁可以分析一下下面这段话中的C语言中的内存动态分配问题。

char *ptr; if ((ptr = (char *)malloc(0)) == NULL) puts("Got a null pointer"); else puts("Got a valid pointer"); 这是一个有趣的问题。最近在我的一个同事不经意把0值传给了函数malloc,得到了一个合法的指针之后,我才想到这个问题。这就是上面的代码,该代码的输出是“Got a valid pointer”。以上这句话是别人说的,麻烦懂得的人分析一下。
2026年09月23日 04:32
有1个网友回答
网友(1):

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