首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我们用负参数调用Malloc时会发生什么?

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

Stack Overflow用户
提问于 2013-07-29 13:46:51
回答 2查看 13.2K关注 0票数 20

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)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-29 13:47:38

即使将负值传递给size_tmalloc值也始终为正。负值被转换为size_t类型的无符号值,这将导致一个巨大的正值。

示例:

代码语言:javascript
复制
char *p = malloc(-2);

相当于:

代码语言:javascript
复制
char *p = malloc(SIZE_MAX - 1);  // SIZE_MAX is the maximum
                                 // size_t value 
票数 27
EN

Stack Overflow用户

发布于 2015-02-13 13:30:49

由于malloc的参数是类型为size_t,它是无符号的,但您传递的是一个有符号的整数,所以整数值将转换为size_t,用于此目的的规则将在C99标准部分草案6.3.1.3有符号和无符号整数中讨论,后者在“反转”项下表示:

否则,如果新类型没有符号,则通过重复增减一个比新类型中可以表示的最大值多一个值来转换该值,直到该值位于新类型的范围内为止。

让我们看看这意味着什么,如果传入-1,那么将添加最大size_t值+1:

代码语言:javascript
复制
-1 + MAX_SIZE_T + 1

其结果是:

代码语言:javascript
复制
 MAX_SIZE_T

对于-5,您将得到以下结果:

代码语言:javascript
复制
MAX_SIZE_T - 4

这意味着对于较小的负值,得到的size_t值将是一个非常大的正数。

那么,在这种情况下,您为什么要为NULL返回malloc呢?如果我们回到标准部分的草稿7.20.3内存管理功能,它说:

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

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17925771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档