malloc(0)

转载 2013年05月15日 21:18:23

【问题】

下列代码的输出结果是什么:

char *ptr = NULL;
if ((ptr = (char *)malloc(0)) == NULL)
  puts("Got a null pointer\n");
else
  puts("Got a valid pointer\n");














【答案】

  got a Valid pointer


【解析】

①C99的最权威的解释:
    If the size of the space requested is zero, the behavior is implementationdefined:
    either a null pointer is returned, or the behavior is as if the size were some
    nonzero value, except that the returned pointer shall not be used to access an object.

②man malloc:
      If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be successfully passed to free().

③MSDN
     If size is 0, malloc allocates a zero-length item in the heap and returns a valid pointer to that item


【总结】

当调用malloc(0)时,可能返回NULL指针,也可能返回一个有效的指针,这是由编译器的实现决定的。

返回有效指针时,该指针可以被正常free,但是不应该其进程操作。

当malloc分配内存时它除了分配我们指定SIZE的内存块,还会分配额外的内存来存储我们的内存块信息,用于维护该内存块。

因此,malloc(0)返回一个合法的指针并指向存储内存块信息的额外内存,

我们当然可以在该内存上进行读写操作,但是这样做了会破坏该内存块的维护信息,

因此当我们调用free(ptr)时就会出现错误。

首先来解释malloc(0)的问题,这个语法是对的,而且确实也分配了内存,但是内存空间是0,

就是说返回给你的指针是不能用的,感觉奇怪吧?但是从操作系统的原理来解释就不奇怪了,

这要涉及操作系统维护内存的方法来说了,在内存管理中,内存被分为2部分,栈和堆,栈有自己的机器指令,由系统分配,

是一个先进后出的数据结构,malloc分配的内存是堆内存,由于堆没有自己的机器指令,

所以要有系统自己编写算法(库函数)来管理这片内存,通常的做法是用链表,在每片被分配的内存前加个表头,

里面存储了被分配内存的起始地址和大小,你的malloc返回的就是表头里的起始指针,这个地址是由一系列的算法得来了,

通常不会为0,一旦分配成功,就返回一个有效的指针,对于分配0空间来说,算法已经算出可用内存的起始地址,

但是你占用0空间,所以对那个指针操作就是错误的,操作系统一般不知道其终止地址,因为有占用大小就可以推出终止地址,

还有就是即使分配0空间也要释放它,其实是释放的链表结点 。
还有,返回的指针是可用地址的起始地址,虽然你可以无限赋值,但是其实是错误的,

因为可能有其他有用的数据在那一片区域,如果指针越界就会出现意想不到的事情。



malloc(0)的理解

  • 2013年03月26日 17:59
  • 4KB
  • 下载

C语言中关于malloc(0)问题

首先来解释malloc(0)的问题,这个语法是对的,而且确实也分配了内存,但是内存空间是0,就是说返回给你的指针是不能用的,感觉奇怪吧?但是从操作系统的原理来解释就不奇怪了,这要涉及操作系统维护内存的...
  • harhy
  • harhy
  • 2016年07月31日 06:28
  • 1283

malloc(0)的返回值

最近,看了有关malloc(0)的返回值以及其他一些问题的讨论,我把自己的感受和看法记录如下: 问题:char* ptr = malloc(0*sizeof(char)); if(NULL == ...

C语言 malloc(0)的问题

转载地址:http://blog.csdn.net/bigheaven/article/details/7286862 感谢作者. 如下: [cpp] view plai...

malloc(0)返回什么

首先用两段代码说明一下现象,后面再解释现象的原因: malloc的正确用法: char *p = NULL; p = (char*)malloc(100); if(p == NULL)...

malloc(0)的问题

转自:http://blog.csdn.net/js_xj/article/details/5826042 ANSI C的,如果认为malloc(0)是语法错误的话,下面我写的就不用看了。 下...

malloc()参数为0的情况

问题来自于《程序员面试宝典(第三版)》第12.2节面试例题9,主要是结合原书代码和解析,讨论malloc(0)的行为,对原书没说清的地方进行补充。...

How much memory does malloc(0) allocate?

原文:http://prog21.dadgum.com/179.html On most systems, this little C program will soak up all av...

malloc()参数为0的情况

下面的代码片段输出是什么?为什么? char *ptr; if((ptr = (char *)malloc(0))==NULL) puts("Got a null pointer"); ...
  • ghevinn
  • ghevinn
  • 2014年06月06日 16:18
  • 3707

malloc(0)?

问题内容:malloc(0)返回什么地址? 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=4351400 所属论坛:C语言 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:malloc(0)
举报原因:
原因补充:

(最多只允许输入30个字)