2009-07-02 56 views
39

很简单的问题,我提出了以下方案:零大小的malloc

#include <stdlib.h> 
int main(int argc, char ** argv) 
{ 
    void * ptr; 
    ptr = malloc(0); 
    free(ptr); 
} 

而且它不会在我的机器上出现段错误。它是stdlib malloc和free的可移植行为,还是我在寻找麻烦?

编辑:似乎不便携是由malloc返回的值。问题是关于malloc(0)+自由组合,而不是ptr的值。

+1

请记住,如果这个不奏效,还有不得不有很多特殊情况码。人们总是会根据变量或表达式来分配大量字节,并且每次都必须检查零是很尴尬的。 – 2009-10-26 13:33:51

+0

相关:http://stackoverflow.com/questions/2022335/whats-the-point-in-malloc0 – jldupont 2010-01-07 18:23:46

+0

我知道:超级晚评论这个封闭的问题。但是`malloc(0)`有一些用法,没有提到。在那些返回非NULL值的实现中,尤其是在DEBUG构建中,它可能会分配比您要求的更多的值,并为您提供指向刚刚经过其内部头的指针。如果在一系列分配之前和之后得到这个值,这可以让你感觉到实际的内存使用情况。 – 2017-02-24 17:57:13

回答

54

该行为是实现定义的,您将收到NULL指针或地址。对于接收到的指针调用free然而它不能产生一个问题,因为:

  • 免费(NULL)就可以了,没有操作完成
  • 免费(地址)是确定的,如果从malloc的接收地址(或其他人像calloc等)
23

它允许返回NULL,并允许它返回一个不能解引用的非NULL指针 。这两种方法是由标准(7.20.3)认可:

如果空间的请求的大小是零,则该行为 实现定义的:要么是空指针被返回,或者 行为是作为如果大小是非零值,则不应使用返回的指针访问对象。

+1

这不完全是问题。我不关心malloc返回的值,而是关于通过malloc(0)返回的指针调用free。 – shodanex 2009-07-02 09:32:08

+2

这仍然是一个非常好的答案,因为与Key的答案一起给出了对行为的完整概述。 – schnaader 2009-10-26 14:21:29

3

很抱歉的麻烦,我应该已经阅读了手册页:

的malloc()分配size个字节,并返回一个指针分配的内存。内存不被清除。如果size为0,则malloc()返回NULL,或者返回一个可以稍后成功传递给free()的唯一指针值。 (),calloc()或realloc()返回的ptr所指向的内存空间必须已经返回。否则,或者如果之前已调用了空闲(ptr),则会发生未定义的行为。如果ptr为NULL,则不执行任何操作。

看来这是真的,至少在GNU libc的

1

更新考虑到LIBT &大同的评论:

调用malloc的行为(0)是依赖于实现或者换句话说,非便携 且未定义。

链接到CFaq问题了解更多详情。

1

根据C标准

7.20.3 如果空间的请求的大小为零,则行为实现定义:返回任一个空指针,或行为是因为如果尺寸是一些非零值,但不应使用返回的指针访问对象。

-2

根据我的经验,我已经看到的malloc(0)返回一个可以释放的指针。 但是,这会在以后的malloc()语句中导致SIGSEGV。 这是非常随机的。

当我增加了一个检查,对于不调用malloc如果要分配的大小是零,我摆脱了这一点。

所以,我建议不要对大小分配内存0

-Ashutosh