首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言 malloc(-1) vs malloc(0xffffffff) 結果不同:有符號/無符號轉換陷阱

     編輯:程式設計綜合問答

現象

`malloc(-1)` 失敗,`malloc(0xffffffff)` 成功 (返回非 NULL),雖然兩者位模式相同 (0xFFFFFFFF)。

原因

`malloc` 參數類型為 `size_t` (**無符號**)。
- `-1` 為 **有符號 int**,傳遞時發生**有符號→無符號轉換**,但某些舊編譯器/庫在轉換前檢查「若有符號值 < 0 則直接返回 NULL」。
- `0xffffffff` 為 **無符號常數** (或 `unsigned int`),直接匹配 `size_t`,視為合法巨大請求 (4GB-1),若地址空間允許可能成功 (64 位系統)。

驗證代碼

printf("%zu\n", (size_t)-1);       // 18446744073709551615 (64位)
printf("%zu\n", (size_t)0xffffffffu); // 4294967295
// 兩者值不同!關鍵在常數類型。

建議

永遠對 `malloc` 傳遞 **無符號類型** 或 `size_t` 變量,避免負數字面量:
`malloc((size_t)n)` 或 `malloc((unsigned)n)`。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved