零大小的malloc

时间:2009-07-02 08:27:41

标签: c malloc

非常简单的问题,我做了以下程序:

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

它不会在我的机器上发生段错误。它是stdlib malloc的可移植行为还是免费的,还是我在寻找麻烦?

编辑:看似不可移植的是malloc返回的值。问题是关于malloc(0)+自由组合,而不是ptr的值。

7 个答案:

答案 0 :(得分:58)

行为是实现定义的,您将收到NULL指针或地址。但是,为接收到的指针调用应该不会导致问题,因为:

  • free(NULL)没问题,没有进行任何操作
  • 免费(地址)没问题,如果从malloc(或其他像calloc等)收到地址的话。

答案 1 :(得分:26)

允许返回NULL,并允许返回非NULL指针 你不能解除引用。两种方式都由标准(7.20.3)批准:

  

如果请求的空间大小为零,则行为为   implementation-defined:返回空指针,或者   行为就像大小是一些非零值,除了   返回的指针不得用于访问对象。

答案 2 :(得分:4)

不好意思,我应该阅读手册页:

malloc()分配大小字节并返回指向已分配内存的指针。内存未清除。如果size为0,则malloc()返回NULL或a    唯一指针值,以后可以成功传递给free()。​​

free()释放ptr指向的内存空间,该内存空间必须由之前调用malloc(),calloc()或realloc()返回。否则,或者如果    之前已经调用了free(ptr),发生了未定义的行为。如果ptr为NULL,则不执行任何操作。

至少对于gnu libc来说似乎是真的

答案 3 :(得分:3)

根据c标准

7.20.3 如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,除了返回的指针不应用于访问对象。

答案 4 :(得分:1)

考虑到libt&amp; amp; Pax的评论:

调用malloc(0)的行为是依赖于实现的,换句话说是非可移植的和undefined。

链接到CFaq问题以获取更多详细信息。

答案 5 :(得分:0)

虽然它可能是合法的C / C ++,但它表明存在更大的问题。我通常称之为'指针邋。'。

参见“不要对malloc(0)或calloc(0)的结果做出假设”,https://www.securecoding.cert.org/confluence/display/seccode/VOID+MEMxx-A.+Do+not+make+assumptions+about+the+result+of+malloc%280%29+or+calloc%280%29

答案 6 :(得分:-3)

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

当我添加一个支票时,如果要分配的大小为零,不要调用malloc,我就摆脱了这个。

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

-Ashutosh