7.22.3.4 malloc函数malloc函数为其大小由大小指定且其值不确定的对象分配空间。
原型:void *malloc(size_t size);
我尝试将一个负值作为参数传递:malloc(negative)返回NULL。
是因为将NULL**?**负数转换为无符号值,不能分配所需的空间,还是函数检查参数,并返回
如果它被转换为大正数,那么当调用malloc(INT_MIN+2)时,它仍然返回NULL,但是分配给指针的malloc(0)和*p = somevalue工作。那这个呢?
是否定义了实现?
阅读此链接:malloc(0)
发布于 2013-07-29 13:47:38
即使将负值传递给size_t,malloc值也始终为正。负值被转换为size_t类型的无符号值,这将导致一个巨大的正值。
示例:
char *p = malloc(-2);相当于:
char *p = malloc(SIZE_MAX - 1); // SIZE_MAX is the maximum
// size_t value 发布于 2015-02-13 13:30:49
由于malloc的参数是类型为size_t,它是无符号的,但您传递的是一个有符号的整数,所以整数值将转换为size_t,用于此目的的规则将在C99标准部分草案6.3.1.3有符号和无符号整数中讨论,后者在“反转”项下表示:
否则,如果新类型没有符号,则通过重复增减一个比新类型中可以表示的最大值多一个值来转换该值,直到该值位于新类型的范围内为止。
让我们看看这意味着什么,如果传入-1,那么将添加最大size_t值+1:
-1 + MAX_SIZE_T + 1其结果是:
MAX_SIZE_T对于-5,您将得到以下结果:
MAX_SIZE_T - 4这意味着对于较小的负值,得到的size_t值将是一个非常大的正数。
那么,在这种情况下,您为什么要为NULL返回malloc呢?如果我们回到标准部分的草稿7.20.3内存管理功能,它说:
如果空间无法分配,则返回空指针。
您提出的请求太大,空间无法分配。
https://stackoverflow.com/questions/17925771
复制相似问题