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)
答案 0 :(得分:22)
即使您将负值传递给size_t
,malloc
值也始终为正。负值将转换为size_t
类型的无符号值,从而产生巨大的正值。
示例:
char *p = malloc(-2);
相当于:
char *p = malloc(SIZE_MAX - 1); // SIZE_MAX is the maximum
// size_t value
答案 1 :(得分:4)
由于malloc
的参数类型为 size_t ,它是无符号的,但是您传递的是带符号的整数,整数值将转换为 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
内存管理功能,它会说:
如果无法分配空间,则为空指针 返回
您发出的请求太大,无法分配空间。