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)
即使将负值传递给malloc
,size_t
值也始终为正值。负值被转换为size_t
类型的无符号值,这导致巨大的正值。
示例:
char *p = malloc(-2);
相当于:
char *p = malloc(SIZE_MAX - 1); // SIZE_MAX is the maximum
// size_t value
由于malloc
的参数类型为size_t,它是无符号的,但您传递的是一个有符号的整数,因此整数值将转换为size_t。这方面的规则在C99标准草案6.3.1.3
有符号和无符号整数中介绍,它位于转换下,它说:
否则,如果新类型是无符号的,则通过重复添加或比新类型中可以表示的最大值多减去一直到该值在新类型的范围内。49)
让我们看一个这意味着什么的例子,如果您传入-1
,那么将添加最大size_t值+1:
-1 + MAX_SIZE_T + 1
结果是:
MAX_SIZE_T
对于-5
,您最终会得到:
MAX_SIZE_T - 4
这意味着对于较小的负值,生成的size_t值将是一个非常大的正数。
那么,为什么在这些情况下,您会收到malloc
的NULL
?如果我们回到标准草案7.20.3
内存管理功能,它说:
如果无法分配空间,则为空指针返回
您提出的请求太大,无法分配空间。