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

Din*_*mar 17 c malloc

7.22.3.4 malloc函数malloc函数为一个对象分配空间,该对象的大小由size指定,其值是不确定的.

原型: void *malloc(size_t size);

我尝试将负值作为参数传递:malloc(negative)return NULL.

是因为[size_t]否定转换为无符号[某个大值]并且不能分配所需的空间或者是函数检查参数并返回NULL

如果它转换为大正值,那么当malloc(INT_MIN+2)它调用它仍然返回NULL,但malloc(0)分配指针和*p = somevalue工作.那这个呢?

它是实现定义的吗?

阅读此链接:malloc(0)

oua*_*uah 23

一个size_t即使你传递一个负值值始终为正malloc.负值转换为类型的无符号值,size_t从而产生巨大的正值.

例:

char *p = malloc(-2);
Run Code Online (Sandbox Code Playgroud)

相当于:

char *p = malloc(SIZE_MAX - 1);  // SIZE_MAX is the maximum
                                 // size_t value 
Run Code Online (Sandbox Code Playgroud)

  • @Dineshkumar:让我们假设 `int` 和 `size_t` 都是 32 位。如果 `INT_MIN == -2147483648` 和 `offset == 100`,则 `INT_MIN + offset == -2147483548`,当转换为 32 位 `size_t` 时会产生 `+2147483748`。 (2认同)

Sha*_*our 5

由于to的参数是无符号的size_tmalloc类型,但您传递的是带符号的整数,因此该整数值将转换为size_t,其规则在C99标准草案草稿“ 转换转换”下的“有符号和无符号整数”中进行了介绍。它说:6.3.1.3

否则,如果新类型是无符号的,则通过重复添加或减去比新类型可表示的最大值多一个值来转换该值,直到该值在新类型的范围之内(49)。

让我们看一下这意味着什么的示例,如果您传入,-1则会添加最大size_t值+ 1:

-1 + MAX_SIZE_T + 1
Run Code Online (Sandbox Code Playgroud)

结果是:

 MAX_SIZE_T
Run Code Online (Sandbox Code Playgroud)

因为-5您最终会得到:

MAX_SIZE_T - 4
Run Code Online (Sandbox Code Playgroud)

这意味着对于较小的负值,所得的size_t值将为非常大的正数。

那么,为什么在这种情况下您会收到NULL退款malloc?如果我们回到标准草案的“ 7.20.3 内存管理功能”部分,它会说:

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

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