簡體   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