谁可以分析一下下面这段话中的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”。
以上这句话是别人说的,麻烦懂得的人分析一下。 展开
if ((ptr = (char *)malloc(0)) == NULL)
puts("Got a null pointer");
else
puts("Got a valid pointer");
这是一个有趣的问题。最近在我的一个同事不经意把0值传给了函数malloc,得到了一个合法的指针之后,我才想到这个问题。这就是上面的代码,该代码的输出是“Got a valid pointer”。
以上这句话是别人说的,麻烦懂得的人分析一下。 展开
1个回答
展开全部
虽然你传入的参数是0,但实际上malloc仍然会为你分配一块4字节的内存(不同编译器可能有不同大小)。就比如你malloc(1),其实得到的内存块大小跟malloc(2)是一样的,这是由内存分配算法决定的。
这么做的原因其实很简单:大部分程序碰到malloc返回NULL的时候,都会认为内存不足,从而去开辟一个新堆或者直接就进入错误处理函数了。为了避免应用程序误判,malloc只要有内存,就一定会返回一个有效指针。
至于为什么是4字节,简单地说是因为考虑到内存分配算法和内存访问效率。这块牵涉到算法和一些硬件方面的知识,你有兴趣的话可以自己去看为什么。
这么做的原因其实很简单:大部分程序碰到malloc返回NULL的时候,都会认为内存不足,从而去开辟一个新堆或者直接就进入错误处理函数了。为了避免应用程序误判,malloc只要有内存,就一定会返回一个有效指针。
至于为什么是4字节,简单地说是因为考虑到内存分配算法和内存访问效率。这块牵涉到算法和一些硬件方面的知识,你有兴趣的话可以自己去看为什么。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询