2011-03-24 135 views
2
#include <stdio.h> 

int main(void) 
{ 
    int x = 99; 
    int *pt1; 

    pt1 = &x; 

    printf("Value at p1: %d\n", *pt1); 
    printf("Address of p1 (with %%p): %p\n", pt1); 
    printf("Address of p1 (with %%d): %d\n", pt1); 

    return 0; 
} 

什麼缺點/危險打印機指針值與%d代替%p打印指針值

+0

您可能要選擇一個答案,「右」之一。 – DevSolar 2011-05-30 06:26:18

回答

5

%d顯示的整數的 - 沒有需要一個指針的大小等於一個整數的大小。

+1

我猜想在64位系統上(例如Windows 7 64位或Linux amd64),即使指針的大小是64位,int的大小也是32位樣式。 – BenjaminB 2011-03-24 12:04:14

+3

如果大小不相等,並且你不投射,那麼你是在說謊的VA_ARGS爲printf,這是未定義的行爲! – Flexo 2011-03-24 12:07:06

+1

@awoodland,不僅僅是它是UB,如果在'%d'之後還有另一個格式說明符,它將會出錯,因爲堆棧會被搞亂。 – 2011-03-24 12:39:44

2

如果您的系統指針發生不被大小爲int小號一樣,可以引起screwage無限量的。如果它們恰好相同,那麼你可能是安全的。然而,就語言標準而言,傳遞一個指針並將其作爲一個整數來處理它,可以讓你的電腦着火,向你的老闆發送色情電子郵件,或者使惡魔從你的鼻子飛出。它可能不會做任何這些事情,但它可能會打印出誤導性的值或其他東西。

不要這樣做。使用%p除非你迫切需要將地址視爲一個整數(注意:你可能不需要);在這種情況下,實際上將其轉換爲整數類型,以便您不濫用參數傳遞機制。

0

我不知道危險和缺點,但是通過使用你失去像(12 VS 0x000012)格式化指針%d符號。

4
  • 的sizeof(INT *)不必等於sizeof(int)的

  • 庫實現可以自由地使用指針值的一個不同的,更適當的呈現(例如,十六進制記數法)。

  • %p是簡單的 「做正確的事」。這是標準所說的應該用於指針,而使用%d是濫用整數說明符。

想象一下,當有人refactors你的代碼,有點過於狂熱地交換所有的「整數」與「長」和所有「%d」和「%LD」 ......哎呀發生了什麼。

+0

好的謝謝。這是從我的懶惰思考,我很幸運,我們的架構上確實sizeof(int *)== sizeof(int)。自動十六進制符號很好。 – abishell 2011-03-25 09:45:18

+0

有趣。對我來說,第三點總是最強的論點。 ;-) – DevSolar 2011-03-25 14:15:04

0

除了危險,在其他的答案中指出,一些編譯器(例如GCC與格式字符串警告開啓)會生成您傳遞一個指針%d警告,其預計的int