%u
格式'工作'只要sizeof(void *) == sizeof(unsigned)
,這通常適用於32位代碼,但不適用於64位代碼。如果你想保持格式的控制(你沒有得到控制的%p
外觀),那麼你要使用<inttypes.h>
從C99:
printf("0x%.8" PRIXPTR "\n", (uintptr_t)&object);
宏PRIXPTR提供了正確的長度修改爲uintptr_t
類型的值和轉換說明符X
。類型uintptr_t
是一個足夠大的整數類型來存放任何指針。 .8
可確保您至少可以打印8位十六進制數字,但如果地址數量爲64位,並且位數設置爲數值的前32位(最重要),則該位數更多。
嚴格,如果你打算使用%p
,則(a)您應確保在棧上的價值實際上是一個void *
是鑄造(因爲fprintf()
等是可變參數的功能,並不會自動發生轉換) (b)格式沒有跨平臺的標準。它通常相當於小寫十六進制,不帶前綴0x
;一些系統會生成前綴0x
。在實踐中,你通常會安全通過int *
。
理論上,在標準C中,沒有辦法打印函數指針;不能保證函數指針與數據指針的大小相同。幸運的是,POSIX步入並聲明在POSIX系統上,函數指針的大小應與數據指針的大小相同。因此,至少在Unix系統上,事實上在Windows系統上,您可以安全地打印數據指針和函數指針。
其他指針可以隱轉換爲無效指針,但我不確定在C變量函數中應用得如何。 – chris