2017-02-23 128 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