C如何在没有编译器警告的情况下将地址打印为十进制值(不是十六进制)
我有一个int指向另一个地址的指针int。
当使用格式说明符打印指针时%p(如 Stack Overflow 上的许多答案所建议的那样),它以十六进制表示形式打印。
如何用十进制表示打印指针的值?
代码示例
我想出了一个可以%zu从这个答案中使用的人。
int i = 1;
int *p = &i;
printf("Printing p: %%p = %p, %%zu = %zun", p, p);
当我使用https://onlinegdb.com/EBienCIJnm运行该代码时
- 它实际上以十进制打印正确的值
- 但它也会输出编译器警告
warning: format ‘%zu’ expects argument of type ‘size_t’, but argument 3 has type ‘int *’ [-Wformat=]
Printing p: %p = 0x7ffee623d8c4, %zu = 140732759529668
有没有办法printf使用十进制表示的指针值,而没有编译器警告?
回答
转换为 中uintptr_t定义的类型<stdint.h>并使用PRIuPTR中定义的说明符进行格式化<inttypes.h>:
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("%" PRIuPTR "n", (uintptr_t) &argc);
}