追加' 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警告?
答案 0 :(得分:4)
%p用于指针地址,毕竟是整数,
不,从C / C ++类型系统的角度来看,指针不是整数。
指针既不是算术也不是整数类型,是迂腐的,请参阅std::is_integral,std::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;
}