C 如何在没有编译器警告的情况下将地址打印为十进制值不是十六进制

问题描述

我有一个 commonjs() 指针指向另一个 int 的地址。

使用格式说明符 int 打印指针时(如 Stack Overflow 上的许多答案所建议的那样),它以十六进制 表示形式打印。

如何用十进制表示打印指针的值?


代码示例

我发现可以使用 this answer 中的 %p

%zu

当我使用 https://onlinegdb.com/EBienCIJnm

运行该代码
  • 它实际上以十进制打印了正确的值
  • 但是它也会输出一个编译器警告
int i = 1;
int *p = &i;
printf("Printing p: %%p = %p,%%zu = %zu\n",p,p);

有没有办法在没有编译器警告的情况下warning: format ‘%zu’ expects argument of type ‘size_t’,but argument 3 has type ‘int *’ [-Wformat=] Printing p: %p = 0x7ffee623d8c4,%zu = 140732759529668 使用十进制表示的指针值?

解决方法

转换为 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);
}
,

将指针投射到uintmax_t(在<stdint.h>中定义),并用%ju打印投射结果:

printf("Printing p: %%p = %p,%%ju = %ju\n",p,(uintmax_t)p);

请注意,不能保证 uintmax_t 的宽度足以容纳一个指针,但它可能没问题。 (如果它不适用于您的平台,编译器可能会抱怨。)您可以按照其他地方的建议使用 uintptr_t,但在 uintmax_t 不够宽的情况下,uintptr_t 获胜根本不存在。

总的来说,你最好学习如何处理十六进制输出:-)