【问题标题】:malloc(-1) returns NULL but malloc(0) doesn't why? how can you allocate 0 memory space [duplicate]malloc(-1) 返回 NULL 但 malloc(0) 不为什么?你怎么能分配0内存空间[重复]
【发布时间】:2012-09-02 11:12:58
【问题描述】:

可能重复:
what's the point in malloc(0)?
what does malloc(0) return?

此代码显示“不成功”,但如果将 -1 替换为 0,则它不会为 NULL。我不明白如何分配 0 内存空间。我知道没有用但不是 NULL == 0L 所以它也应该是 == 0 ..

#include <stdio.h>
#include <stdlib.h>
int main()
{
int *ptr;
if((ptr = malloc(-1)) == NULL)
    printf("unsuccessful: no memory space was allocated.\n");
else{
    printf("successful: memoryspace was allocated. \n");
    free(ptr);
}
getch();
return 0;

}

【问题讨论】:

  • 当malloc 失败并返回NULL 它应该设置errno 并且你应该打印strerror(errno)
  • “我不明白你怎么能分配 0 个内存空间”——只是不要调用 malloc() !!
  • 是的,我倾向于通过一种清理方式分配一些东西(或者什么都没有)的多种可能性。无需检查是否调用了 malloc。从 C++ 类的角度来看它更有意义,但我想它可能发生在 C 中。
  • 我不会使用它。这是一个“如果”的问题。
  • NULL == 0L 不一定,不是。在 C(不是 C++)中,NULL 被键入为一个值为 0 的指针(void *)(0),所以不要陷入在所有情况下都将 NULL 等同于零的陷阱。

标签: c memory null malloc


【解决方案1】:

它是实现定义的:

7.22.3-1

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

所以它可以返回NULL,但它没有有返回。另外,为了澄清malloc(-1) 失败的原因,请注意它的原型是:

void *malloc(size_t size);
             ^^^^^^

因此,您将-1 转换为无符号类型,从而产生非常大的值。

【讨论】:

    猜你喜欢
    • 2022-12-09
    • 2011-01-09
    • 2011-03-30
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多