代码之家  ›  专栏  ›  技术社区  ›  shodanex

零大小malloc[重复]

  •  44
  • shodanex  · 技术社区  · 17 年前

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

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

    而且我的机器没有故障。这是stdlib malloc和free的便携行为,还是我在找麻烦?

    编辑:看起来不可移植的是malloc返回的值。问题在于malloc(0)+free组合,而不是ptr的值。

    7 回复  |  直到 17 年前
        1
  •  67
  •   Key    17 年前

    行为由实现定义,您将收到一个空指针或一个地址。但是,为接收到的指针调用free不会导致问题,因为:

    • 免费(地址)是可以的,如果地址是从malloc(或其他类似calloc等)收到的
        2
  •  33
  •   dfa    17 年前

    它可以返回NULL,也可以返回非NULL指针 你不能取消引用。标准(7.20.3)规定了两种方式:

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

        3
  •  4
  •   shodanex    17 年前

    很抱歉给您添麻烦,我应该阅读手册页:

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

    免费的 释放ptr指向的内存空间,该内存空间必须由以前对malloc()、calloc()或realloc()的调用返回。否则,或 free(ptr)以前已被调用,出现未定义的行为。如果ptr为NULL,则不执行任何操作。

    至少对于gnu libc来说,这似乎是正确的

        4
  •  3
  •   rohittt    17 年前

    根据c标准

    如果请求的空间大小为零,则行为由实现定义:要么返回空指针,要么行为就好像大小是某个非零值,但返回的指针不应用于访问对象。

        5
  •  1
  •   Aditya Sehgal    17 年前

    调用malloc(0)的行为依赖于实现,或者换句话说是不可移植的 而且没有定义。

    链接到 CFaq 更多细节的问题。

        7
  •  -3
  •   Ashutosh Singhal    13 年前

    这是非常随机的。

    当我添加了一个检查,如果要分配的大小为零,就不要调用malloc,我去掉了这个。

    -阿什图什