零大小的malloc

sho*_*nex 45 c malloc

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

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

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

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

Key*_*Key 59

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

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


dfa*_*dfa 26

允许返回NULL,并允许返回一个无法解除引用的非NULL指针.这两种方式都受到标准(7.20.3)的制裁:

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

  • 它仍然是一个非常好的答案,因为与Key的答案一起,它提供了对行为的完整概述. (4认同)