2014-10-10 28 views
3

當我做指針的sizeof與printf的表示有什麼不同?

int k = 9; 
printf("sizeof k: %zu \n", sizeof (&k)); 

我得到的大小8。但是當我做

printf("pointer to k: %p \n", &k); 

我得到0x7fff57e3ba24。我可以看到這是12個十六進制數,這意味着(因爲1十六進制是4位)指針佔用了6個字節的48位。

問題:爲什麼sizeof打印8指針雖然只有6個字節?

+2

http://www.viva64.com/en/a/0050/ – 2014-10-10 06:14:19

+0

儘管amd64 ISA使用64位指針,實際上目前只使用48位。因此,在今天的大多數桌面系統中,您確實會看到存儲在64位插槽中的「48位」指針。 – 2014-10-10 06:17:16

+0

@JohnZwinck因爲沒有地址存在於這樣一個「很遠」的位置佔用整個64位? (內存中沒有這麼多插槽?) – user10607 2014-10-10 06:26:44

回答

8

你的邏輯是,如果我寫

printf("%d", 4); 

和它打印1周十進制數,其可以潛在地被存儲在1個字節,那麼sizeof(int)必須是1個字節。

0x7fff57e3ba240x00007fff57e3ba24相同。僅僅因爲這個數字恰好比這個類型可以存儲的數字更少,並不意味着它佔用了更少的空間。

3

即使最高位爲零,您的指針仍然佔用8個字節。

儘管可以通過消除不必要的字節來「優化」數據存儲,但數據訪問將變得更加複雜和效率更低。閱讀有關計算機內存中的數據對齊方式。

1

前導零不具有意義,因爲地址是無符號的,因此前兩個字節爲零,因此不打印。 您可以修改格式說明符以打印前導零。

+0

如何修改printf格式以打印前導零? – user10607 2014-10-10 11:35:34

+1

參考以下鏈接:[link] http://stackoverflow.com/questions/1255099/whats-the-proper-use-of-printf-to-display-pointers-padded-with-0s – 2014-10-10 11:56:55

相關問題