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

C語言指標位址輸出位數差異:32 位 vs 64 位系統記憶體模型解析

     編輯:C 語言問答

現象

int i;
printf("%p\n", &i);
// 32 位系統輸出: 0x0012FF7C (8 位十六進位)
// 64 位系統輸出: 0x000000000012FF7C (16 位十六進位)
// 若用 %d 輸出: 32 位為 10 位十進位,64 位為 20 位十進位

核心原因:位址總線寬度決定位址空間大小

為什麼你看到 7 位十進位數字?

若在 32 位系統用 %d 印位址 0x0012FF7C = 1245052 (7 位十進位)。最高位 0x00 被省略,實際佔 4 位元組。

正確列印位址的方式

int i;
printf("Address: %p\n", (void*)&i);      // 標準、可攜、自動配合指標大小
printf("Address: 0x%zx\n", (uintptr_t)&i); // C99: %zx 對應 size_t, uintptr_t 保證容納指標
  • 不要用 %d, %ld, %x —— 位寬不匹配導致未定義行為。
  • %p 期望 void*,需強制轉型 (void*)。

延伸:虛擬記憶體佈局

用戶空間位址通常在低位(32 位 0x00000000~0x7FFFFFFF,64 位 0x0000000000000000~0x00007FFFFFFFFFFF),核心空間在高位。0x0012FF7C 典型為堆疊區位址(向下增長)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
架構位址寬度位址空間指標大小十六進位位數
32 位 (x86)32 bits4 GB4 bytes8 位 (0xXXXXXXXX)
64 位 (x64)48~52 bits (實作)256 TB ~ 4 PB8 bytes12~16 位 (0x0000XXXXXXXXXXXX)