当我们用负参数调用Malloc时会发生什么?
7.22.3.4 malloc函数malloc函数为一个对象分配空间,该对象的大小由size指定,其值是不确定的。
原型: 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
符号和无符号整数中涵盖。在Conversions下,它说:
否则,如果新类型是无符号的,则通过重复加或减一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.49)
让我们看一下这意味着什么的例子,如果你传入-1
那么将添加max size_t value + 1:
-1 + MAX_SIZE_T + 1
这导致:
MAX_SIZE_T
对于-5
你最终得到:
MAX_SIZE_T - 4
这意味着对于小的负值,得到的size_t值将是一个非常大的正数。
那么为什么在这些情况下你会收到malloc
NULL
? 如果我们回到标准草案7.20.3
内存管理function草案,它说:
如果无法分配空间,则返回空指针
您发出的请求太大,无法分配空间。