現象
int i;
printf("%p\n", &i);
// 32 位系統輸出: 0x0012FF7C (8 位十六進位)
// 64 位系統輸出: 0x000000000012FF7C (16 位十六進位)
// 若用 %d 輸出: 32 位為 10 位十進位,64 位為 20 位十進位
核心原因:位址總線寬度決定位址空間大小
| 架構 | 位址寬度 | 位址空間 | 指標大小 | 十六進位位數 |
| 32 位 (x86) | 32 bits | 4 GB | 4 bytes | 8 位 (0xXXXXXXXX) |
| 64 位 (x64) | 48~52 bits (實作) | 256 TB ~ 4 PB | 8 bytes | 12~16 位 (0x0000XXXXXXXXXXXX) |
為什麼你看到 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 典型為堆疊區位址(向下增長)。
- 上一篇文章: 老師講課與課本不一致怎麼辦?C語言學習認知差異化解指南
- 下一篇文章: 自學 C 語言一個月能學會嗎?階段性目標與高效學習法
Copyright ©
程式碼之家 All Rights Reserved