2017-02-23 89 views
5

正在追加'0'作爲標誌到printf%p格式說明符是否正確?printf格式說明符爲%p標記'0',是否正確?

#include <stdio.h> 
int main() 
{ 
    int a = 42; 
    void* p = &a; 
    printf("Pointer address: %08p", p); 
    return 0; 
} 

也在Ideone

編譯類似於上面的一些代碼,我沒有警告或任何從Microsoft Visual C++ 2015年,但是從GCC 5.4.0警告:

「警告:‘0’與‘%P’已使用標誌gnu_printf格式[-Wformat]」

cppreference printf閱讀,我看到:

0:整數和浮點數轉換,前導零 用於填充的字段,而不是空格字符。對於整數 數字,如果明確指定了精度,則會忽略它。對於 使用此標誌的其他轉換會導致未定義的行爲。如果 - 標誌存在,則忽略 。

據我可以解釋,%p是指針地址,畢竟這是一個整數,所以這個未定義的行爲適用於%p?
如果不是,爲什麼GCC-Wformat警告?

+0

oook,所以爲什麼downvote? – roalz

+0

我猜想,因爲代碼是無意義的,不會爲基本的語法原因編譯? 'printf(「Pointer address:%08p」, return 0;'不要在這裏鍵入代碼,而是複製/粘貼實際的代碼或一個工作示例 – Lundin

+0

Jez,對,我剛剛發現從Ideone複製粘貼不起作用正如我所料,編輯。 – roalz

回答

5

%p是指針地址,這是所有

雖然指針確實有數字表示,該標準不考慮指針組成的數據類型後的整數倍。因此,使用%08p格式會導致未定義的行爲。

您可以解決這個問題,通過using uintptr_t data type,你的指針轉換它,然後打印出來作爲一個無符號整數:

#include <cinttypes> 
#include <cstdint> 

int main() { 
    int i = 123; 
    void* p = &i; 
    printf("%08" PRIxPTR "\n", (uintptr_t)p); 
    return 0; 
} 

Demo.

4

%P爲指針地址,它是一個整數畢竟

不,一個指針不是從視C/C++型系統點的整數。

指針既不是算術也不是整數類型,是迂腐的,請參閱std::is_integralstd::is_arithmetic