2012-07-16 32 views
0
#include <stdio.h> 
int main(void) 
{ 
    int *ptr; 
    printf("The Hex value of ptr is 0x%x",ptr); 
    printf("The pointer value of ptr is %p",ptr); 
} 

,輸出是有點不同,我不知道爲什麼爲什麼指針的值因使用printf(%x)而不同?

The Hex value of ptr is 0x24a77950 
The pointer value of ptr is 0x7fff24a77950 

它顯示PTR的值是一個十六進制整數,但十六進制輸出缺少的一部分7fff

這是對printf的格式問題還是其他什麼東西?

+0

[使用了錯誤的格式說明將調用*未定義的行爲*](https://stackoverflow.com/a/30354164/995714) – 2017-10-28 16:41:57

+1

可能重複[當我使用錯誤的格式說明符時會發生什麼?](https://stackoverflow.com/questions/16864552/what-happens-when-i-use-the-wrong-format-specifier) – 2017-10-28 16:42:09

回答

3

%×投射指針爲無符號整數(32位長)。在64位機器上,您的指針長度爲8字節(64位)。

印刷用%P打印整個指針,在其完整的大小 - 64位。但是當您使用%x進行打印時,只打印較低的32位。因此,使用%p打印指針總是安全的。

你可以做如下添加額外的2線和驗證:

printf("size of unsigned int is %lu\n", sizeof(unsigned int)); 
printf("size of pointer is %lu\n", sizeof(int *)); 

在64位機採用了64位的操作系統,這應該分別給你4和8。

看到已經回答了兩個類似的問題:與question 1question 2

+1

錯誤。 '%x'不會投射任何東西。 [行爲未定義](https://stackoverflow.com/q/14504148/995714) – 2017-10-28 16:40:07

相關問題