printf格式说明符标记' 0'对于%p,是否正确?

时间:2017-02-23 13:16:19

标签: c++ printf gcc-warning

追加' 0'作为printf%p格式说明符的标志是否正确?

#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发出警告:

&#34;警告:&#39; 0&#39;用于&#39;%p&#39; gnu_printf格式[-Wformat]&#34;

cppreference printf阅读,我看到了:

  

0:对于整数和浮点数转换,前导零   用于填充字段而不是空格字符。对于整数   如果明确指定了精度,则忽略它们。对于   使用此标志的其他转换会导致未定义的行为。它是   忽略if - flag存在。

据我所知,%p是指针地址,毕竟是一个整数,所以这个未定义的行为适用于%p?
如果没有,为什么GCC -Wformat警告?

2 个答案:

答案 0 :(得分:4)

  

%p用于指针地址,毕竟是整数,

不,从C / C ++类型系统的角度来看,指针不是整数。

指针既不是算术也不是整数类型,是迂腐的,请参阅std::is_integralstd::is_arithmetic

答案 1 :(得分:4)

  

%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.