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

char*ptr;if((ptr=(char*)malloc(0))==NULL)puts("Gotanullpointer");elseputs("Gotavalidp... 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”。

以上这句话是别人说的,麻烦懂得的人分析一下。
展开
 我来答
starfar1983
2011-04-02 · TA获得超过2258个赞
知道小有建树答主
回答量:692
采纳率:0%
帮助的人:1036万
展开全部
虽然你传入的参数是0,但实际上malloc仍然会为你分配一块4字节的内存(不同编译器可能有不同大小)。就比如你malloc(1),其实得到的内存块大小跟malloc(2)是一样的,这是由内存分配算法决定的。
这么做的原因其实很简单:大部分程序碰到malloc返回NULL的时候,都会认为内存不足,从而去开辟一个新堆或者直接就进入错误处理函数了。为了避免应用程序误判,malloc只要有内存,就一定会返回一个有效指针。
至于为什么是4字节,简单地说是因为考虑到内存分配算法和内存访问效率。这块牵涉到算法和一些硬件方面的知识,你有兴趣的话可以自己去看为什么。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式