20

7.22.3.4 malloc 函数 malloc 函数为大小由大小指定且值不确定的对象分配空间。

原型:void *malloc(size_t size);

我尝试将负值作为参数传递:malloc(negative)返回NULL

是因为 [size_t] 负数转换为无符号 [某个大值] 并且无法分配所需的空间还是函数检查参数并返回NULL

如果它被转换为大正数,那么在调用malloc(INT_MIN+2)它时仍然返回NULL,但malloc(0)分配给指针并*p = somevalue工作。那这个呢?

是否定义了实现?

阅读此链接:malloc(0)

4

2 回答 2

27

size_t即使您将负值传递给 ,值也始终为正malloc。负值转换为无符号类型的值,size_t这会导致巨大的正值。

例子:

char *p = malloc(-2);

相当于:

char *p = malloc(SIZE_MAX - 1);  // SIZE_MAX is the maximum
                                 // size_t value 
于 2013-07-29T13:47:38.043 回答
7

由于 to 的参数是无符号的size_tmalloc类型,但您传递的是带符号的整数,因此整数值将转换为size_t的规则包含在草稿 C99 标准部分有符号和无符号整数中,它属于转换和它说:6.3.1.3

否则,如果新类型是无符号的,则通过在新类型中可以表示的最大值重复加或减一来转换值,直到该值在新类型的范围内。49)

让我们看一个例子来说明这意味着什么,如果你传入-1然后 max size_t value + 1 将被添加:

-1 + MAX_SIZE_T + 1

这导致:

 MAX_SIZE_T

因为-5你最终会得到:

MAX_SIZE_T - 4

这意味着对于小的负值,生成的 size_t 值将是一个非常大的正数。

那么为什么在这些情况下你会收到NULL回报呢?malloc如果我们回到标准草案的7.20.3 内存管理功能部分,它会说:

如果无法分配空间,则返回空指针

您提出的请求太大,无法分配空间。

于 2015-02-13T13:30:49.280 回答