繁体   English   中英

当我们用负参数调用Malloc时会发生什么?

[英]what happens when we call Malloc with negative parameter?

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 内存管理功能,它说:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM